Skip to content

OSAC-2872: Storage Control Plane PRD - #134

Merged
openshift-merge-bot[bot] merged 8 commits into
osac-project:mainfrom
akshaynadkarni:feat/OSAC-2872-storage-control-plane-prd
Jul 22, 2026
Merged

openshift-merge-bot[bot] merged 8 commits into
osac-project:mainfrom
akshaynadkarni:feat/OSAC-2872-storage-control-plane-prd

Conversation

@akshaynadkarni

@akshaynadkarni akshaynadkarni commented Jul 21, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Product requirements for OSAC-2872 (OSAC Storage Control Plane). Defines the storage architecture for CaaS tenant clusters: a CSI driver that presents opaque storage tiers, control plane services for tier resolution, policy enforcement, and credential management, volume inventory tracking, packaging, and automated deployment to tenant clusters.

Why

OSAC CaaS tenants need block storage but there is no vendor-agnostic storage layer today. Without one, tenants see vendor-specific StorageClasses and backend addresses, vendor credentials are stored on tenant clusters, there is no enforcement point for storage policy, and the platform has no inventory of volumes. This PRD captures the v0.2 scope and locked decisions from three rounds of clarification.

v0.2 Scope

  • PV create, delete, and read (get/list) on tenant clusters
  • VAST as the only vendor backend for block storage
  • Tenant Admin/User have the same PVC capabilities (no persona-specific access control)
  • StorageClasses named after configured storage tiers, no vendor credentials on tenant clusters
  • Central volume inventory with tenant, tier, state, and size
  • Automated cluster storage deployment extending OSAC-1001 and OSAC-1332

Out of Scope (v0.2)

  • Volume attach/detach, resize, snapshots, clones, PV update
  • Public Volume API and UI integration (OSAC-984)
  • CSI certification, quota lifecycle, metering, audit logging
  • VMaaS and BMaaS storage integration

Dependencies

  • OSAC-917 (Storage Framework): StorageBackend and StorageTier entities
  • ClusterOrder provisioning
  • OSAC-1001 (Cluster Storage Setup) and OSAC-1332 (Tenant Onboarding)

Ticket

OSAC-2872


Signed-off-by: akshaynadkarni 25892229+akshaynadkarni@users.noreply.github.com
Assisted-by: Cursor/Claude

Summary by CodeRabbit

  • Documentation
    • Added a product requirements document for the OSAC Storage Control Plane.
    • Defines tenant-facing tiered storage with authorization and policy enforcement, secure credential handling, and centralized volume inventory tracking.
    • Documents supported workflows, user stories, assumptions, dependencies, and clearly states in-scope vs out-of-scope capabilities for v0.2.

Product requirements for the OSAC Storage Control Plane: a CSI driver
and control plane services that let CaaS tenants consume block storage
through opaque tiers without vendor exposure, with per-request credential
management, policy enforcement, and central volume inventory.

v0.2 scope covers PV create, delete, and read with VAST as the only
vendor backend. Volume attach/detach, resize, snapshots, and public
volume API are out of scope.

Signed-off-by: akshaynadkarni <25892229+akshaynadkarni@users.noreply.github.com>
Assisted-by: Cursor/Claude
Signed-off-by: akshaynadkarni <25892229+akshaynadkarni@users.noreply.github.com>
@openshift-ci-robot

openshift-ci-robot commented Jul 21, 2026 •

Copy link
Copy Markdown

@akshaynadkarni: This pull request references OSAC-2872 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 feature to target the "5.0.0" version, but no target version was set.

Details

In response to this:

Summary

Product requirements for OSAC-2872 (OSAC Storage Control Plane). Defines the storage architecture for CaaS tenant clusters: a CSI driver that presents opaque storage tiers, control plane services for tier resolution, policy enforcement, and credential management, volume inventory tracking, packaging, and automated deployment to tenant clusters.

Why

OSAC CaaS tenants need block storage but there is no vendor-agnostic storage layer today. Without one, tenants see vendor-specific StorageClasses and backend addresses, vendor credentials are stored on tenant clusters, there is no enforcement point for storage policy, and the platform has no inventory of volumes. This PRD captures the v0.2 scope and locked decisions from three rounds of clarification.

v0.2 Scope

  • PV create, delete, and read (get/list) on tenant clusters
  • VAST as the only vendor backend for block storage
  • Tenant Admin/User have the same PVC capabilities (no persona-specific access control)
  • StorageClasses named after configured storage tiers, no vendor credentials on tenant clusters
  • Central volume inventory with tenant, tier, state, and size
  • Automated cluster storage deployment extending OSAC-1001 and OSAC-1332

Out of Scope (v0.2)

  • Volume attach/detach, resize, snapshots, clones, PV update
  • Public Volume API and UI integration (OSAC-984)
  • CSI certification, quota lifecycle, metering, audit logging
  • VMaaS and BMaaS storage integration

Dependencies

  • OSAC-917 (Storage Framework): StorageBackend and StorageTier entities
  • ClusterOrder provisioning
  • OSAC-1001 (Cluster Storage Setup) and OSAC-1332 (Tenant Onboarding)

Ticket

OSAC-2872


Signed-off-by: akshaynadkarni 25892229+akshaynadkarni@users.noreply.github.com
Assisted-by: Cursor/Claude

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.

@openshift-ci

openshift-ci Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: akshaynadkarni

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

@coderabbitai

coderabbitai Bot commented Jul 21, 2026 •

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@akshaynadkarni, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 52 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

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

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: cc06bf41-8d32-4c16-bf90-9336025c6c9a

📥 Commits

Reviewing files that changed from the base of the PR and between bf31262 and 3bafc68.

📒 Files selected for processing (1)
  • enhancements/storage-control-plane-osac-2872/prd.md

Walkthrough

Adds a PRD for an OSAC Storage Control Plane, defining vendor-agnostic tiered storage, policy enforcement, credential handling, volume inventory, user workflows, scope boundaries, assumptions, and dependencies.

Changes

Storage Control Plane Product Definition

Layer / File(s) Summary
Problem statement and scope
enhancements/storage-control-plane-osac-2872/prd.md
Introduces the PRD and defines control plane responsibilities, v0.2 capabilities, explicit exclusions, and document metadata.
User workflows and delivery constraints
enhancements/storage-control-plane-osac-2872/prd.md
Documents tenant and cloud provider workflows, assumptions, provisioning constraints, and required dependencies.

Estimated code review effort: 1 (Trivial) | ~3 minutes

Possibly related PRs

Suggested reviewers: ronniel1, avishayt, wgordon17, danniesh, zszabo-rh

🚥 Pre-merge checks | ✅ 11
✅ Passed checks (11 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately identifies the PRD and main subject: the OSAC storage control plane.
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 only adds a markdown PRD and contains no hardcoded secrets, embedded creds, private keys, or long base64 literals.
No-Weak-Crypto ✅ Passed Doc-only PRD; I found no MD5/SHA1/DES/RC4/3DES/Blowfish/ECB, custom crypto, or unsafe secret comparisons.
No-Injection-Vectors ✅ Passed PR changes only a Markdown PRD; no code or unsafe patterns like eval, shell=True, yaml.load, or DOM injection were introduced.
Container-Privileges ✅ Passed Only a PRD markdown file changed; no K8s/container manifests or privilege settings (privileged, hostPID/Network/IPC, SYS_ADMIN, allowPrivilegeEscalation, root) are present.
No-Sensitive-Data-In-Logs ✅ Passed Only a PRD markdown file changed; it contains no log statements or sensitive-data leakage patterns, and diff scans found nothing risky.
Ai-Attribution ✅ Passed AI tools are mentioned in the commit, and the commit trailer uses Red Hat’s Assisted-by attribution; no Co-Authored-By trailer was found.
✨ 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

github-actions Bot commented Jul 21, 2026 •

Copy link
Copy Markdown

AI EP Review: EP-134

Score: 9/10 | Verdict: PASS

Criterion Score Notes
What 2/2 Clear user-observable outcomes with specific per-persona user stories for Tenant Admin/User (6 stories) and Cloud Provider Admin (4 stories). Capabilities are concrete: PVC create/delete with opaque tiers, kubectl-based volume viewing, automatic post-provisioning readiness, central inventory. Cloud Infrastructure Admin persona (responsible for storage tiers per osac-dimensions.md) is absent but dependency on OSAC-917 may justify this.
Why 2/2 Strong business justification naming four concrete problems: vendor-specific StorageClasses leak to tenants, vendor credentials stored on tenant clusters (security risk), no policy enforcement point, and no volume inventory for accountability. The Problem Statement ties directly to platform adoption.
How 1/2 User stories are specific and measurable, but the In Scope section mixes user outcomes with internal implementation: 'Tier resolution (maps a tenant's StorageClass to the correct vendor backend)' is design leakage; 'Private Volume API' is explicitly an internal service described in a PRD; 'Storage driver packaging' describes delivery mechanics rather than user-observable behavior. These belong in the design document.
Task 2/2 This is a clear product feature enhancement — a storage control plane enabling vendor-agnostic block storage for CaaS tenants. Not a bug, task, documentation change, or content-only deliverable.
Size 2/2 Tightly coupled capabilities that require each other to deliver value: the storage driver needs the control plane, the control plane needs the inventory, and automated deployment is the day-1 setup making it all work. Clear Out of Scope boundaries with Jira cross-references for deferred work.

Verdict: A well-structured PRD with clear user need, strong justification, and testable user stories, held back slightly by design leakage in the In Scope section where internal services and packaging are described alongside user-observable outcomes.

Feedback: Rewrite In Scope items 2, 4, and 5 as user-observable outcomes rather than internal service descriptions. For example, replace 'Tier resolution (maps a tenant's StorageClass to the correct vendor backend)' with what the tenant or admin actually experiences. Remove the 'Private Volume API' item entirely — internal APIs belong in the design document, not the PRD. Consider adding a brief note about the Cloud Infrastructure Admin persona and whether their storage tier configuration workflows are covered by the OSAC-917 dependency.

Critical (0)

None.

Important (3)

  1. In Scope item 2 ('Storage control plane services: Tier resolution, policy enforcement, credential management') describes internal architecture rather than user-observable outcomes — rewrite as what tenants/admins experience.
  2. In Scope item 4 ('Private Volume API: Internal CRUD operations for volume records, consumed by platform services') is explicitly an internal service and should be moved to the design document.
  3. In Scope item 5 ('Storage driver packaging') describes distribution and installation mechanics — rewrite as the user-facing outcome (e.g., StorageClasses are available on tenant clusters matching their configured tiers).

Suggestions (2)

  1. Add a note about the Cloud Infrastructure Admin persona — they are responsible for storage tiers per osac-dimensions.md. Even if OSAC-917 covers their workflows, the PRD should acknowledge this persona and clarify the boundary.
  2. The Out of Scope section is thorough with Jira cross-references — consider adding version targets (v0.3, future) consistently for all deferred items to help reviewers understand the roadmap.

Review cost

Model: claude-opus-4-6
Cost: $0.5823
Tokens: 6 in / 4.2k out
Cache: 159.1k read
Active time: 1m 35s
API calls: 0

@github-actions github-actions Bot added the rfe-creator-auto-reviewed EP was reviewed by AI label Jul 21, 2026
…cket ID

Signed-off-by: akshaynadkarni <25892229+akshaynadkarni@users.noreply.github.com>
Assisted-by: Cursor/Claude
Signed-off-by: akshaynadkarni <25892229+akshaynadkarni@users.noreply.github.com>
Remove volume attach/detach and PV update from out of scope since they
were never in scope for this feature. Soften tenant inventory story to
reflect that volume visibility through OSAC interfaces is OSAC-984 scope.

Signed-off-by: akshaynadkarni <25892229+akshaynadkarni@users.noreply.github.com>
Assisted-by: Cursor/Claude
Signed-off-by: akshaynadkarni <25892229+akshaynadkarni@users.noreply.github.com>
@github-actions

Copy link
Copy Markdown

AI EP Review: EP-134

Score: 9/10 | Verdict: PASS

Criterion Score Notes
What 2/2 Clear user-observable capabilities with per-persona user stories for Tenant Admin/User and Cloud Provider Admin. CaaS service explicitly in scope. Each affected persona has concrete stories describing what they can do. Minor gap: Cloud Infrastructure Admin (who manages storage tiers and backends per osac-dimensions.md) is not addressed, though this may be scoped under dependency OSAC-917.
Why 2/2 Problem statement names four concrete pain points: vendor details exposed to tenants, credentials stored insecurely on tenant clusters, no policy enforcement point, no volume inventory. Clear causal chain from gap to consequence. Ties to CaaS adoption for stateful workloads.
How 1/2 User stories are mostly verifiable via standard Kubernetes tools (kubectl, PVC creation). However, In Scope items leak design details ('Tier resolution maps a StorageClass to the correct vendor backend', 'Private Volume API: Internal CRUD operations consumed by platform services'). Inconsistency: Tenant User story claims volume inventory tracking for 'full accountability' but In Scope #4 says Volume API is 'Not exposed to tenants' — unclear how tenants observe this benefit. No measurable accepta
Task 2/2 Clearly a product feature enhancement introducing a new storage control plane with driver, control plane services, volume inventory, and automated deployment. Not a bug, task, or documentation change.
Size 2/2 Tightly coupled scope — storage driver requires control plane services for tier resolution and credentials; control plane is meaningless without the driver; inventory is populated by the driver; packaging and automated deployment tie it together. Extensive Out of Scope section (13 items) shows strong scope discipline. Comparable to calibration example R=2.

Verdict: A well-structured PRD with clear user outcomes and strong business justification, held back slightly by design leakage in In Scope items and a tenant inventory story that contradicts the private Volume API scope.

Feedback: Rewrite In Scope items 2 and 4 to describe user-observable outcomes rather than internal architecture — e.g., replace 'Tier resolution (maps a tenant's StorageClass to the correct vendor backend)' with 'Tenants see only opaque storage tier names; vendor backend details are never exposed.' Resolve the contradiction between the Tenant User inventory story and the Private Volume API scope: either clarify how tenants observe volume tracking (e.g., via kubectl or a future public API) or remove the tenant-facing inventory story and keep it as a Cloud Provider Admin capability only. Consider adding Cloud Infrastructure Admin stories for storage backend and tier configuration, or explicitly note that persona's scope is covered by OSAC-917.

Critical (0)

None.

Important (3)

  1. In Scope Bump actions/checkout from 4 to 5 #2 ('Tier resolution maps a tenant StorageClass to the correct vendor backend') and Create bare metal fulfillment proposal #4 ('Private Volume API: Internal CRUD operations for volume records, consumed by platform services') describe internal architecture rather than user-observable outcomes. Rewrite to focus on what users see: opaque tier names, no vendor exposure, platform-tracked volumes.
  2. Tenant User story says 'I want every volume I create tracked in a central inventory so that I can have full accountability' but In Scope Create bare metal fulfillment proposal #4 declares the Volume API 'Not exposed to tenants.' If tenants cannot query the inventory, the accountability benefit is unobservable from their perspective. Either clarify the tenant-facing observation mechanism or reassign this story to Cloud Provider Admin.
  3. Cloud Infrastructure Admin persona is absent despite osac-dimensions.md identifying them as the persona who manages storage tiers, backends, and infrastructure integration (VAST). If their responsibilities are covered by OSAC-917, state this explicitly in the Assumptions or Out of Scope section.

Suggestions (3)

  1. Replace 'immediately after provisioning' with a measurable target (e.g., 'within 5 minutes of cluster reaching Ready') to make the user story testable.
  2. Add brief notes on E2E testing, documentation, and UI dimensions per osac-dimensions.md — even if deferred, explicitly stating 'UI: deferred to OSAC-984' and 'E2E: covered by integration test scope in design' prevents reviewer questions.
  3. The Assumptions section restates Dependencies almost verbatim. Consider consolidating or differentiating: assumptions are unverified beliefs, dependencies are known external requirements.

Review cost

Model: claude-opus-4-6
Cost: $0.6577
Tokens: 7 in / 5.8k out
Cache: 219.3k read
Active time: 2m 15s
API calls: 0

@github-actions

github-actions Bot commented Jul 21, 2026 •

Copy link
Copy Markdown

AI EP Review: EP-134

Score: 8/10 | Verdict: PASS

Criterion Score Notes
What 1/2 Clear user-facing outcomes for Tenant Admin/User (6 stories) and Cloud Provider Admin (4 stories). However, Cloud Infrastructure Admin — the persona responsible for managing storage tiers, integrating with VAST, and configuring storage backends per osac-dimensions.md — has no user stories. The PRD delegates this to OSAC-917 (Storage Framework) but never explicitly addresses who configures storage tiers or how, leaving a persona gap.
Why 2/2 Strong problem statement with four concrete consequences of inaction: tenants see vendor-specific StorageClasses, vendor credentials stored on tenant clusters (security risk), no enforcement point for per-tenant storage policy, and no volume inventory. Clear causal chain from gap to impact.
How 1/2 User stories are mostly specific and verifiable (create PVC, delete PVC, view volumes via kubectl, Pending event on unconfigured StorageClass). However, the In Scope section mixes user outcomes with internal architecture: 'Tier resolution (maps a tenant StorageClass to the correct vendor backend)' describes an internal mechanism, 'Private Volume API' is explicitly internal, and 'Storage driver packaging' is an implementation concern. No measurable acceptance criteria (e.g., 'immediately after pr
Task 2/2 This is a clear product feature enhancement — a storage control plane that adds new platform capabilities (vendor-agnostic block storage, volume inventory, automated deployment). Not a bug, task, or documentation change.
Size 2/2 Well-scoped and tightly coupled: the storage driver requires the control plane services (tier resolution, credentials), the control plane has no consumer without the driver, the volume inventory is a byproduct of driver operations, and automated deployment ties them together. These cannot ship independently.

Verdict: A solid PRD with clear user outcomes and strong justification, held back slightly by a missing Cloud Infrastructure Admin persona and design leakage in the In Scope section.

Feedback: Add user stories for the Cloud Infrastructure Admin persona — they manage storage tiers and integrate with vendor backends like VAST per osac-dimensions.md, even if the configuration mechanism comes from OSAC-917, this PRD should describe what they observe and do. Rewrite In Scope items 2, 4, and 5 to describe user-observable outcomes rather than internal architecture (e.g., replace 'Private Volume API: Internal CRUD operations' with the admin-observable capability it enables). Add measurable targets to key user stories (e.g., 'storage ready within N minutes of cluster provisioning').

Critical (0)

None.

Important (3)

  1. Cloud Infrastructure Admin persona has no user stories. Per osac-dimensions.md, this persona 'manages core infrastructure (network, firewall, compute, storage)' and 'integrates control plane with local infrastructure' including storage tiers and VAST integration. Even if storage tier configuration is delivered by OSAC-917, this PRD should include stories for what the Cloud Infrastructure Admin observes or does in the context of the storage control plane (e.g., verifying storage backend connectiv
  2. In Scope items contain design leakage. Item 2 ('Tier resolution maps a tenant StorageClass to the correct vendor backend') describes an internal mapping mechanism. Item 4 ('Private Volume API: Internal CRUD operations for volume records, consumed by platform services') is explicitly internal. Item 5 ('Storage driver packaging') describes implementation packaging. These should be rewritten as user-observable outcomes or moved to the design document.
  3. No measurable acceptance criteria. User stories like 'I want storage to be ready on my cluster immediately after provisioning' lack time bounds. 'I want every volume I create tracked centrally' lacks specifics on how admins verify this (API? CLI? UI?). Adding measurable targets would strengthen testability.

Suggestions (3)

  1. Add explicit OSAC dimension coverage for Documentation and E2E Testing — both are absent. Even if deferred, state that explicitly (e.g., 'Documentation: deferred to design phase' and 'E2E Testing: covered in design').
  2. The Cloud Provider Admin story about 'vendor credentials never stored on tenant clusters' is a security-oriented requirement. Consider adding a brief Risks section addressing what happens if the control plane is unavailable (tenants can't create PVCs) and any data-at-rest implications for the central volume inventory.
  3. Consider splitting the combined 'Tenant Admin/User' stories if v0.2+ will differentiate their storage capabilities (the PRD notes they are the same in v0.2 but doesn't address future divergence).

Review cost

Model: claude-opus-4-6
Cost: $0.3677
Tokens: 6 in / 5.3k out
Cache: 202.5k read
Active time: 1m 56s
API calls: 0

Volume inventory tracks four states for v0.2: creating, available,
deleting, deleted. Removed attached/detached states and VolumeAttachment
API references since Kubernetes owns attachment lifecycle and those
details belong in the design document, not the PRD.

Signed-off-by: akshaynadkarni <25892229+akshaynadkarni@users.noreply.github.com>
Assisted-by: Cursor/Claude
Signed-off-by: akshaynadkarni <25892229+akshaynadkarni@users.noreply.github.com>
@github-actions

github-actions Bot commented Jul 21, 2026 •

Copy link
Copy Markdown

AI EP Review: EP-134

Score: 8/10 | Verdict: PASS

Criterion Score Notes
What 1/2 Clear user stories for Tenant Admin/User (6) and Cloud Provider Admin (4), but Cloud Infrastructure Admin persona is entirely missing despite being the persona responsible for managing storage infrastructure, configuring VAST backends, and defining storage tiers (per osac-dimensions.md). The OSAC-917 dependency delivers StorageBackend and StorageTier entities — who creates those? Services (CaaS) are identified. Problem statement is specific.
Why 2/2 Strong justification naming four concrete pain points: vendor-specific StorageClass exposure, credentials stored on tenant clusters, no enforcement point for per-tenant storage policy, and no volume inventory. Consequences are specific and tie to security (credential leak risk) and operational gaps (no inventory, no policy).
How 1/2 User stories are mostly user-observable and testable, but the In Scope section has significant design leakage: 'Private Volume API' (item 4) is explicitly internal, 'tier resolution (maps a tenant's StorageClass to the correct vendor backend)' (item 2) describes internal service behavior, 'storage driver packaging' (item 5) is implementation detail, and 'cross-cluster authentication' (item 6) describes an internal mechanism rather than a user outcome. These should be rewritten as user-observable
Task 2/2 Clearly a product feature enhancement introducing new platform capabilities (storage control plane, volume inventory, automated storage deployment). Not a task, bug, or documentation change.
Size 2/2 Tightly coupled capabilities — the storage driver requires the control plane services, which require the volume inventory. Driver packaging is needed for automated deployment. No capability can ship independently and provide value. Well-focused scope with clear out-of-scope boundaries (resize, snapshots, metering, quota lifecycle deferred).

Verdict: A solid PRD with clear user need, strong justification, and well-scoped capabilities, held back by a missing Cloud Infrastructure Admin persona and moderate design leakage in the In Scope section.

Feedback: Add Cloud Infrastructure Admin user stories — this persona configures StorageBackend and StorageTier entities (OSAC-917), defines which vendor backends are available, and manages VAST integration. Without their stories, the PRD doesn't cover who sets up the storage infrastructure that tenants consume. Rewrite In Scope items 2, 4, 5, and 6 to describe user-observable outcomes rather than internal architecture: replace 'Private Volume API' with the admin capability it enables, replace 'tier resolution' with what the tenant sees, and replace 'storage driver packaging' with the deployment outcome. Consider adding Documentation and E2E Testing dimension coverage (even if deferred).

Critical (0)

None.

Important (3)

  1. Missing Cloud Infrastructure Admin persona: per osac-dimensions.md, this persona manages 'core infrastructure (network, firewall, compute, storage)' and 'integrates with VAST/ESI.' The OSAC-917 dependency delivers StorageBackend and StorageTier entities that this persona would configure, yet no user stories exist for them.
  2. Design leakage in In Scope section: Item 2 ('tier resolution maps a tenant's StorageClass to the correct vendor backend'), item 4 ('Private Volume API: Internal CRUD operations'), item 5 ('Storage driver packaging'), and item 6 ('cross-cluster authentication') describe internal architecture rather than user-observable outcomes. A PM could not verify these by using the product.
  3. User story 'I want cross-cluster authentication established automatically' describes an internal mechanism; the user-observable outcome is 'tenant clusters communicate securely with the storage control plane without manual setup.'

Suggestions (3)

  1. Add Documentation dimension coverage — even if deferred, state explicitly whether user guides or API reference are in scope for this milestone.
  2. Add E2E Testing dimension coverage — identify which user-visible flows must work (e.g., PVC create/delete on a freshly provisioned cluster).
  3. Consider splitting Tenant Admin and Tenant User stories if v0.3+ will differentiate their storage capabilities (the PRD notes they are the same in v0.2, which is good, but future differentiation should be anticipated in out-of-scope).

Review cost

Model: claude-opus-4-6
Cost: $0.6032
Tokens: 6 in / 4.8k out
Cache: 159.9k read
Active time: 1m 45s
API calls: 0

Separate the single volume inventory story into three persona-specific
stories: Tenant User (attribution), Tenant Admin (org-wide visibility),
Cloud Provider Admin (per-tenant accountability).

Signed-off-by: akshaynadkarni <25892229+akshaynadkarni@users.noreply.github.com>
Assisted-by: Cursor/Claude
Signed-off-by: akshaynadkarni <25892229+akshaynadkarni@users.noreply.github.com>
@akshaynadkarni
akshaynadkarni marked this pull request as ready for review July 21, 2026 15:35
@openshift-ci
openshift-ci Bot requested review from carbonin and larsks July 21, 2026 15:35
@akshaynadkarni
akshaynadkarni requested review from DanNiESh, avishayt, rgolangh, ronniel1, wgordon17 and zszabo-rh and removed request for carbonin and larsks July 21, 2026 15:36
@github-actions

github-actions Bot commented Jul 21, 2026 •

Copy link
Copy Markdown

AI EP Review: EP-134

Score: 8/10 | Verdict: PASS

Criterion Score Notes
What 1/2 User stories are grouped by persona with clear 'As a...' format for Tenant Admin/User and Cloud Provider Admin. However, Cloud Infrastructure Admin — the persona who 'manages core infrastructure (network, firewall, compute, storage)' per osac-dimensions.md — is missing despite being the persona who would configure storage backends and tiers. The PRD references 'tenant's configured storage tiers' but never describes who configures them. Services (CaaS) and cross-cutting dimensions (storage, provi
Why 2/2 Strong justification in the Problem Statement naming four concrete problems: vendor-specific StorageClasses exposed to tenants, vendor credentials stored on tenant clusters (security risk), no enforcement point for per-tenant storage policy, and no volume inventory. These tie to multi-tenancy isolation, security posture, and platform adoption. Score 2.
How 1/2 The In Scope section contains design leakage: 'Private Volume API' describes an internal API, 'Tier resolution (maps a tenant's StorageClass to the correct vendor backend)' describes internal mechanism, and 'Storage driver packaging' is implementation detail. Additionally, user stories about volume visibility (tenant user tracking, tenant admin cross-cluster view) conflict with the Public Volume API being explicitly out of scope (OSAC-984), making those stories unverifiable within this feature's
Task 2/2 This is a proper product feature enhancement delivering a new platform capability (vendor-agnostic storage for CaaS clusters). Not a task, bug, or documentation change.
Size 2/2 Tightly coupled capabilities: the storage driver requires the control plane services, volume inventory is integral to the control plane, automated deployment requires the packaged driver, and none provide standalone value. The Out of Scope section cleanly defers independent capabilities (resize, snapshots, metering, quota lifecycle, VMaaS/BMaaS integration).

Verdict: A solid PRD with concrete justification and well-scoped capabilities, held back by a missing Cloud Infrastructure Admin persona and design leakage in the In Scope section.

Feedback: Add Cloud Infrastructure Admin user stories for configuring storage backends, tiers, and monitoring storage health across tenants — this persona is central to the storage dimension per osac-dimensions.md. Rewrite In Scope items 2 and 4 to describe user-observable outcomes rather than internal mechanisms (e.g., replace 'Private Volume API: Internal CRUD operations' with the user-facing behavior it enables). Resolve the contradiction between user stories promising volume visibility to tenants and the Public Volume API being out of scope — either narrow those stories to what's observable via kubectl, or clarify what interface tenants will use.

Critical (0)

None.

Important (4)

  1. Cloud Infrastructure Admin persona is missing from User Stories despite being the persona responsible for configuring storage backends, tiers, and infrastructure integration per osac-dimensions.md. The PRD references 'tenant's configured storage tiers' but never describes who sets them up or what their workflow looks like.
  2. In Scope item 4 ('Private Volume API: Internal CRUD operations for volume records, consumed by platform services') describes an internal API — this is design leakage. A PRD should describe the user-observable outcome this enables, not the internal mechanism.
  3. User stories for volume visibility ('every volume I create tracked centrally', 'see all volumes across clusters') appear untestable within this feature's scope since the Public Volume API is explicitly out of scope (OSAC-984). Clarify what interface tenants and admins use to observe volume inventory in v0.2, or scope these stories to kubectl-observable state.
  4. In Scope item 2 describes internal mechanisms ('Tier resolution maps a tenant's StorageClass to the correct vendor backend') rather than user-observable behavior. Rewrite to describe what users experience: e.g., 'Tenants create PVCs using opaque storage tier names without knowledge of the underlying vendor.'

Suggestions (3)

  1. Add explicit dimension coverage for Documentation and E2E Testing — even if deferred, state this explicitly per osac-dimensions.md guidance.
  2. Consider adding Installation dimension coverage — deploying the storage control plane services likely requires new Helm chart values or osac-installer changes.
  3. In Scope item 5 ('Storage driver packaging') reads as an implementation task rather than a product requirement. Consider whether this needs to be a separate line item or is implied by item 6 (automated deployment).

Review cost

Model: claude-opus-4-6
Cost: $0.5767
Tokens: 6 in / 4.3k out
Cache: 158.5k read
Active time: 1m 39s
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: 4

🤖 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/storage-control-plane-osac-2872/prd.md`:
- Around line 47-61: Clarify the Tenant Admin and Tenant User capability
definitions in the v0.2 storage requirements by specifying separate create,
delete, read, and list scopes. Tenant Users should be limited to their own
volumes and claims, while Tenant Admins should retain organization-wide
visibility across clusters; explicitly state the authorization scope for each
operation and remove the conflicting statement that both personas have identical
capabilities.
- Line 17: Clarify the v0.2 read scope in the “Storage driver for tenant
clusters” capability description: explicitly state whether PV/volume read
operations are supported through the control-plane driver or are limited to
native Kubernetes API visibility. Align this wording with the PR objective and
user story promising volume viewing, and apply the same clarification to the
corresponding repeated entry.
- Line 51: Clarify the PVC deletion behavior in the storage-control-plane
requirements: define the reclaim policy for generated StorageClasses so
successful PVC deletion removes the backing volume and releases storage, and
specify the inventory state transition and handling when volume deletion fails.
Update the tenant-admin/user deletion story or its acceptance criteria to
preserve these cleanup guarantees.
- Line 13: Clarify the credential trust boundary in the Storage Control Plane
description: ensure vendor plugins on tenant clusters never receive raw vendor
credentials, and specify that credentialed backend calls execute in the trusted
control plane or use an explicitly defined non-exposing flow.
🪄 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: 66b3d431-e42d-418a-9e5f-9f52066b94e7

📥 Commits

Reviewing files that changed from the base of the PR and between e2c6e45 and 98056e9.

📒 Files selected for processing (1)
  • enhancements/storage-control-plane-osac-2872/prd.md

Comment thread enhancements/storage-control-plane-osac-2872/prd.md Outdated
Comment thread enhancements/storage-control-plane-osac-2872/prd.md Outdated
Comment thread enhancements/storage-control-plane-osac-2872/prd.md
Comment thread enhancements/storage-control-plane-osac-2872/prd.md

OSAC CaaS tenants need block storage on their clusters, but there is no vendor-agnostic storage layer today. Without one, tenants would see vendor-specific StorageClasses and backend addresses, vendor credentials would be stored on tenant clusters, there would be no enforcement point for per-tenant storage policy, and the platform would have no inventory of what volumes exist or which tenant owns them.

The Storage Control Plane introduces a single storage driver that presents opaque storage tiers to tenants, enforces authorization and tier-access policies, provides vendor credentials per-request without persisting them on tenant clusters, and tracks every volume in a central inventory.

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.

we're not providing per-request credentials at the moment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Addressed bf31262 (this PR)


1. **Storage driver for tenant clusters**: Handles PVC create, delete, and read (get/list) on tenant clusters through a standard Kubernetes PVC interface. StorageClasses are named after the tenant's configured storage tiers. v0.2 supports VAST as the only vendor backend for block storage.

2. **Storage control plane services**: Tier resolution (maps a tenant's StorageClass to the correct vendor backend), policy enforcement (authorization and tier-access checks), and credential management (vendor credentials provided per-request, never stored on tenant clusters).

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.

no per-request creds for now

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Addressed bf31262 (this PR)


## References

- [Architecture doc: OSAC CSI Meta-Driver](https://docs.google.com/document/d/1GCWco97kWNwFwfbC4TAoyXIxPSMO4CNyqFKv_lQczZU/edit?usp=sharing)

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.

Those drive links are not available for people outside of RH org. we should probably think how to we share such docs, but for now I would remove those

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Good point.
Addressed bf31262 (this PR)

@rgolangh

Copy link
Copy Markdown
Contributor

nits mostly and quick fixes

Remove per-request credential language since that model is not in scope
for v0.2. Credential management is described as platform-managed and
not visible to tenants, without prescribing the delivery mechanism.

Remove References section with Google Docs links since they are not
accessible outside Red Hat.

Signed-off-by: akshaynadkarni <25892229+akshaynadkarni@users.noreply.github.com>
Assisted-by: Cursor/Claude
Signed-off-by: akshaynadkarni <25892229+akshaynadkarni@users.noreply.github.com>
@github-actions

Copy link
Copy Markdown

AI EP Review: EP-134

Score: 9/10 | Verdict: PASS

Criterion Score Notes
What 2/2 Clear user stories grouped by persona (Tenant Admin/User, Cloud Provider Admin). Specific capabilities: PVC create/delete/view, automatic storage provisioning, volume inventory, credential isolation. Each persona has multiple user stories describing observable outcomes.
Why 2/2 Strong problem statement names four concrete consequences of the gap: vendor-specific StorageClasses visible to tenants, vendor credentials exposed, no policy enforcement point, no volume inventory. Ties to tenant security and platform governance.
How 1/2 In Scope section has design leakage: 'storage driver,' 'tier resolution,' 'private volume API,' 'vendor plugins,' 'cross-cluster authentication' are internal architecture, not user-observable outcomes. No measurable acceptance criteria (e.g., 'storage ready within N minutes'). User stories are testable but lack quantified targets.
Task 2/2 Genuine product feature enhancement introducing a new storage control plane capability for OSAC CaaS clusters. Not a task, bug, or documentation change.
Size 2/2 Tightly coupled scope — storage driver, control plane services, inventory, private API, packaging, and automated deployment all require each other to deliver the feature. Cannot ship driver without packaging, cannot use it without control plane, cannot govern without inventory.

Verdict: A well-structured PRD with clear user stories and strong business justification, held back slightly by design leakage in the In Scope section and the absence of measurable acceptance criteria.

Feedback: Rewrite In Scope items as user-observable outcomes rather than system components — e.g., replace 'Storage control plane services: Tier resolution (maps a tenant's StorageClass to the correct vendor backend)' with 'Tenants see only opaque storage tier names; the platform resolves tiers to backends without tenant involvement.' Add measurable acceptance criteria to key user stories (e.g., 'storage ready within 5 minutes of cluster provisioning') so QA can verify without reading code.

Critical (0)

None.

Important (2)

  1. In Scope items 1-5 describe system internals (storage driver, tier resolution, private volume API, vendor plugins) rather than user-observable outcomes. Rewrite as what users can do or observe.
  2. No acceptance criteria or measurable success metrics anywhere in the PRD. User stories like 'storage to be ready immediately after provisioning' need quantified targets to be verifiable.

Suggestions (2)

  1. Cloud Infrastructure Admin persona is absent — if they have a role in configuring storage tiers or backends, add user stories for them.
  2. Consider adding a 'Risks' or 'Assumptions' note about what happens if VAST backend is unavailable — the user-facing failure mode is relevant to the PRD even if the mitigation belongs in the design.

Review cost

Model: claude-opus-4-6
Cost: $0.5130
Tokens: 5 in / 3.7k out
Cache: 99.5k read
Active time: 1m 20s
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.

Caution

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

⚠️ Outside diff range comments (1)
enhancements/storage-control-plane-osac-2872/prd.md (1)

27-27: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Keep vendor controllers off tenant clusters.

Line 27 says vendor plugins are deployed on tenant clusters, while the documented architecture places vendor CSI controllers on the hub/control plane. If interpreted literally, this conflicts with line 69’s guarantee that a compromised tenant cluster cannot access storage backends directly. Distinguish the tenant-facing driver and StorageClasses from hub-side vendor controllers and mediated backend calls.

Based on learnings, vendor CSI controllers run on the hub cluster and credentials never reach tenant clusters.

Also applies to: 69-69

🤖 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/storage-control-plane-osac-2872/prd.md` at line 27, Update the
automated cluster storage deployment statement to keep vendor CSI controllers
and backend credentials on the hub/control plane, while deploying only the
tenant-facing driver and tenant-specific StorageClasses to tenant clusters.
Clarify that storage operations use mediated hub-side calls, preserving the line
69 guarantee that compromised tenant clusters cannot directly access storage
backends.

Source: Learnings

🤖 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.

Outside diff comments:
In `@enhancements/storage-control-plane-osac-2872/prd.md`:
- Line 27: Update the automated cluster storage deployment statement to keep
vendor CSI controllers and backend credentials on the hub/control plane, while
deploying only the tenant-facing driver and tenant-specific StorageClasses to
tenant clusters. Clarify that storage operations use mediated hub-side calls,
preserving the line 69 guarantee that compromised tenant clusters cannot
directly access storage backends.

ℹ️ Review info
⚙️ Run configuration

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

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: fe90c428-1d11-4f57-984a-cdf6e20543c3

📥 Commits

Reviewing files that changed from the base of the PR and between 98056e9 and bf31262.

📒 Files selected for processing (1)
  • enhancements/storage-control-plane-osac-2872/prd.md

Signed-off-by: akshaynadkarni <25892229+akshaynadkarni@users.noreply.github.com>
Assisted-by: Cursor/Claude
Signed-off-by: akshaynadkarni <25892229+akshaynadkarni@users.noreply.github.com>
@github-actions

github-actions Bot commented Jul 21, 2026 •

Copy link
Copy Markdown

AI EP Review: EP-134

Score: 9/10 | Verdict: PASS

Criterion Score Notes
What 2/2 Clear problem statement with four concrete pain points. User stories grouped by Tenant Admin/User (7 stories) and Cloud Provider Admin (4 stories), all following the standard formula with specific actions and goals. Minor gap: Cloud Infrastructure Admin persona (who configures storage backends/tiers) has no user stories, though this may be covered by dependency OSAC-917.
Why 2/2 Concrete justification naming specific pain (no vendor-agnostic storage layer) with four enumerated consequences: vendor-specific StorageClasses visible, vendor credentials exposed to tenants, no policy enforcement point, no volume inventory. Security implication (credential exposure) adds urgency.
How 1/2 User stories are specific and testable (create PVC, delete PVC, view via kubectl, Pending on unconfigured StorageClass). However, the In Scope section has design leakage: 'Tier resolution (maps a tenant StorageClass to the correct vendor backend)' describes internal behavior; 'Private Volume API: Internal CRUD operations' is explicitly non-user-facing; 'Storage driver packaging' and 'vendor plugins' name implementation artifacts rather than user-observable outcomes.
Task 2/2 Clear product feature enhancement introducing a new Storage Control Plane capability with user-facing storage provisioning, inventory, and automated deployment. Not a bug, task, or documentation change.
Size 2/2 Tightly coupled capabilities — the storage driver requires tier resolution to function, inventory requires the driver to have something to track, and automated deployment is the delivery mechanism. Cannot ship independently. Volume inventory is arguably separable but positioned as core platform accountability.

Verdict: Strong PRD with clear user-facing need, concrete business justification, and well-scoped tightly-coupled capabilities; held back slightly by design leakage in the In Scope section where internal services and packaging details are described alongside user outcomes.

Feedback: Rewrite In Scope items 2, 4, and 5 to describe user-observable outcomes rather than internal services — e.g., replace 'Tier resolution (maps a tenant's StorageClass to the correct vendor backend)' with 'Tenants see only opaque storage tier names; the platform resolves the correct backend transparently.' Remove or relocate the Private Volume API item to the design document since it is explicitly internal. Consider adding a note about the Cloud Infrastructure Admin persona — either add user stories for storage backend configuration or explicitly state that persona's needs are covered by the OSAC-917 dependency.

Critical (0)

None.

Important (2)

  1. Design leakage in In Scope section: Items 2 (tier resolution, policy enforcement, credential management described as internal services), 4 (Private Volume API explicitly called 'Internal CRUD operations...not exposed to tenants'), and 5 (storage driver packaging details) describe implementation artifacts rather than user-observable outcomes. Item 6 names 'storage driver, vendor plugins' — implementation details. Rewrite these as user outcomes or move to the design document.
  2. Missing Cloud Infrastructure Admin persona: No user stories for the persona who manages storage infrastructure (backends, tiers, vendor integration). The PRD mentions 'configured storage tiers' but never addresses who configures them. If OSAC-917 covers this, state so explicitly; otherwise add Cloud Infrastructure Admin stories.

Suggestions (3)

  1. Declare CaaS as the in-scope service explicitly — it is implied throughout but never formally stated per the OSAC dimensions framework.
  2. Add explicit cross-cutting dimension coverage: documentation scope (in scope or deferred?), UI scope (deferred per Out of Scope but not called out in dimensions), E2E testing scope, and installation prerequisites for the storage control plane.
  3. Formalize the target milestone — v0.2 is mentioned in passing within user stories and In Scope but not declared as a milestone target with what is and isn't covered.

Review cost

Model: claude-opus-4-6
Cost: $0.3483
Tokens: 6 in / 4.8k out
Cache: 203.1k read
Active time: 1m 41s
API calls: 0

@akshaynadkarni

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 21, 2026 •

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@akshaynadkarni

Copy link
Copy Markdown
Contributor Author

@coderabbitai resolve

@coderabbitai

coderabbitai Bot commented Jul 21, 2026

Copy link
Copy Markdown
✅ Action performed

Comments resolved and changes approved.

@rgolangh

Copy link
Copy Markdown
Contributor

/lgtm
/approved

@openshift-ci openshift-ci Bot added the lgtm label Jul 22, 2026
@openshift-merge-bot
openshift-merge-bot Bot merged commit efd28ac into osac-project:main Jul 22, 2026
5 checks passed
@akshaynadkarni
akshaynadkarni deleted the feat/OSAC-2872-storage-control-plane-prd branch July 22, 2026 15:08
openshift-merge-bot Bot pushed a commit that referenced this pull request Jul 22, 2026
PRE_COMMIT_PR_BASE_SHA is a snapshot from the pull_request webhook
payload, captured at the PR's last open/synchronize event. It doesn't
advance as main gains new commits, and re-running an old CI job replays
that same stale payload rather than refreshing it.

This caused a false-positive class of failure: a long-lived PR that
hasn't been pushed to since some other, unrelated PR merged a
still-non-compliant enhancements/ directory into main would fail
check-ep-naming on that unrelated directory, even though the PR never
touches it and it's already correctly grandfathered on main itself.
Observed concretely on PR #121, which failed on
enhancements/storage-control-plane-osac-2872 (merged by PR #134) despite
never touching that path.

Fix: grandfathering now also checks the live tip of the base branch
(PRE_COMMIT_LIVE_BASE_REF, e.g. origin/main, fetched fresh at the start
of every CI run) in addition to the stale base SHA — a path is
grandfathered if it exists at either reference. This keeps enforcement
scoped to genuinely new paths, so contributors actively fixing their own
directory's naming are never blocked by an unrelated pre-existing
violation elsewhere in the repo.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Tommy Hughes <tohughes@redhat.com>
tchughesiv added a commit to tchughesiv/enhancement-proposals that referenced this pull request Jul 22, 2026
… main pass

These 3 directories were missed by the original OSAC-2870 naming
cleanup (osac-project#139/osac-project#144) specifically because they had active, unmerged PRs
against them at the time the plan was drafted, so their Jira keys and
directory names were still moving targets:

- storage-control-plane-osac-2872 -> OSAC-2872-storage-control-plane
  (Jira key existed, but was still on an open PR (osac-project#134) that hadn't
  merged to main yet when osac-project#139 was planned/built)
- cluster-and-vm-provisioning-wizard -> OSAC-1421-cluster-and-vm-provisioning-wizard
  (key OSAC-1421 has been in the doc's tracking-link since June; PR osac-project#108
  was open against it at audit time)
- metering-and-usage-tracking -> OSAC-985-metering-and-usage-tracking
  (key OSAC-985 has been in the doc's tracking-link for weeks; PRs osac-project#131
  and osac-project#143 were open against it at audit time)

Updated the one cross-reference found repo-wide pointing at the old
cluster-and-vm-provisioning-wizard path (in
OSAC-1319-bare-metal-instance-ui/design.md). No cross-references found
for the other two.

Note: PR osac-project#131 (open, adds a new metering-and-usage-tracking/design.md)
will need to retarget to the new path when it rebases, since it adds a
file git has no rename history for -- flagging this on that PR
separately.

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
PRE_COMMIT_PR_BASE_SHA is a snapshot from the pull_request webhook
payload, captured at the PR's last open/synchronize event. It doesn't
advance as main gains new commits, and re-running an old CI job replays
that same stale payload rather than refreshing it.

This caused a false-positive class of failure: a long-lived PR that
hasn't been pushed to since some other, unrelated PR merged a
still-non-compliant enhancements/ directory into main would fail
check-ep-naming on that unrelated directory, even though the PR never
touches it and it's already correctly grandfathered on main itself.
Observed concretely on PR osac-project#121, which failed on
enhancements/storage-control-plane-osac-2872 (merged by PR osac-project#134) despite
never touching that path.

Fix: grandfathering now also checks the live tip of the base branch
(PRE_COMMIT_LIVE_BASE_REF, e.g. origin/main, fetched fresh at the start
of every CI run) in addition to the stale base SHA — a path is
grandfathered if it exists at either reference. This keeps enforcement
scoped to genuinely new paths, so contributors actively fixing their own
directory's naming are never blocked by an unrelated pre-existing
violation elsewhere in the repo.

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
… main pass

These 3 directories were missed by the original OSAC-2870 naming
cleanup (osac-project#139/osac-project#144) specifically because they had active, unmerged PRs
against them at the time the plan was drafted, so their Jira keys and
directory names were still moving targets:

- storage-control-plane-osac-2872 -> OSAC-2872-storage-control-plane
  (Jira key existed, but was still on an open PR (osac-project#134) that hadn't
  merged to main yet when osac-project#139 was planned/built)
- cluster-and-vm-provisioning-wizard -> OSAC-1421-cluster-and-vm-provisioning-wizard
  (key OSAC-1421 has been in the doc's tracking-link since June; PR osac-project#108
  was open against it at audit time)
- metering-and-usage-tracking -> OSAC-985-metering-and-usage-tracking
  (key OSAC-985 has been in the doc's tracking-link for weeks; PRs osac-project#131
  and osac-project#143 were open against it at audit time)

Updated the one cross-reference found repo-wide pointing at the old
cluster-and-vm-provisioning-wizard path (in
OSAC-1319-bare-metal-instance-ui/design.md). No cross-references found
for the other two.

Note: PR osac-project#131 (open, adds a new metering-and-usage-tracking/design.md)
will need to retarget to the new path when it rebases, since it adds a
file git has no rename history for -- flagging this on that PR
separately.

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
PRE_COMMIT_PR_BASE_SHA is a snapshot from the pull_request webhook
payload, captured at the PR's last open/synchronize event. It doesn't
advance as main gains new commits, and re-running an old CI job replays
that same stale payload rather than refreshing it.

This caused a false-positive class of failure: a long-lived PR that
hasn't been pushed to since some other, unrelated PR merged a
still-non-compliant enhancements/ directory into main would fail
check-ep-naming on that unrelated directory, even though the PR never
touches it and it's already correctly grandfathered on main itself.
Observed concretely on PR osac-project#121, which failed on
enhancements/storage-control-plane-osac-2872 (merged by PR osac-project#134) despite
never touching that path.

Fix: grandfathering now also checks the live tip of the base branch
(PRE_COMMIT_LIVE_BASE_REF, e.g. origin/main, fetched fresh at the start
of every CI run) in addition to the stale base SHA — a path is
grandfathered if it exists at either reference. This keeps enforcement
scoped to genuinely new paths, so contributors actively fixing their own
directory's naming are never blocked by an unrelated pre-existing
violation elsewhere in the repo.

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
… main pass

These 3 directories were missed by the original OSAC-2870 naming
cleanup (osac-project#139/osac-project#144) specifically because they had active, unmerged PRs
against them at the time the plan was drafted, so their Jira keys and
directory names were still moving targets:

- storage-control-plane-osac-2872 -> OSAC-2872-storage-control-plane
  (Jira key existed, but was still on an open PR (osac-project#134) that hadn't
  merged to main yet when osac-project#139 was planned/built)
- cluster-and-vm-provisioning-wizard -> OSAC-1421-cluster-and-vm-provisioning-wizard
  (key OSAC-1421 has been in the doc's tracking-link since June; PR osac-project#108
  was open against it at audit time)
- metering-and-usage-tracking -> OSAC-985-metering-and-usage-tracking
  (key OSAC-985 has been in the doc's tracking-link for weeks; PRs osac-project#131
  and osac-project#143 were open against it at audit time)

Updated the one cross-reference found repo-wide pointing at the old
cluster-and-vm-provisioning-wizard path (in
OSAC-1319-bare-metal-instance-ui/design.md). No cross-references found
for the other two.

Note: PR osac-project#131 (open, adds a new metering-and-usage-tracking/design.md)
will need to retarget to the new path when it rebases, since it adds a
file git has no rename history for -- flagging this on that PR
separately.

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.

3 participants