Skip to content

feat: package and dynamic price to unitconfig translation#4309

Open
rolosp wants to merge 3 commits into
mainfrom
feat/add-unitconfig-to-ratecards
Open

feat: package and dynamic price to unitconfig translation#4309
rolosp wants to merge 3 commits into
mainfrom
feat/add-unitconfig-to-ratecards

Conversation

@rolosp
Copy link
Copy Markdown
Collaborator

@rolosp rolosp commented May 6, 2026

Overview

v3 plan reads previously errored (GET) or silently dropped (LIST) any v1 plan
whose rate cards used DynamicPrice or PackagePrice, since v3 does not
expose those types. This PR translates them on the read path:

  • dynamic(multiplier=m)unit(amount=1) +
    unit_config{operation=multiply, conversion_factor=m}
  • package(amount=a, qpp=q)unit(amount=a) +
    unit_config{operation=divide, conversion_factor=q, rounding=ceiling}

unit_config is added to the v3 RateCard TypeSpec with @visibility(Lifecycle.Read) so it appears on
responses but is not accepted on create/update (no domain type, no schema
change, no migration)

Notes for reviewer

v3 → v1 write path is untouched; this is read-only translation. The
asymmetry (arbitrary UnitConfig has no v1 equivalent) only becomes a
concern once v3 authoring is added — punted via the read-only visibility.

Summary by CodeRabbit

  • New Features

    • Synthesized, read-only unit configuration added to rate cards so v3 surfaces unit-price equivalents for dynamic and package pricing.
    • v3 now represents dynamic and package prices as unit pricing (with synthesized unit config) instead of rejecting them.
  • Bug Fixes

    • Plan listing no longer skips plans with dynamic/package prices; such plans are included in v3 responses.
  • Tests

    • New unit and end-to-end tests cover translations to unit prices, unit-config behavior, rounding, and commitment preservation.

Review Change Stack

@rolosp rolosp requested a review from a team as a code owner May 6, 2026 17:57
@rolosp rolosp added the release-note/feature Release note: Exciting New Features label May 6, 2026
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 6, 2026

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

Walkthrough

Adds a read-only unit_config to RateCard schema, synthesizes v3 BillingUnitConfig from v1 dynamic/package prices (multiply/divide with ceiling), represents those v1 prices as v3 unit prices, stops filtering such plans in v3 LIST, and adds unit and e2e tests for the translation.

Changes

Dynamic/Package Price Translation to v3 Unit Pricing

Layer / File(s) Summary
Schema Definition
api/spec/packages/aip/src/productcatalog/ratecard.tsp
Imported unitconfig.tsp and added optional, read-only unit_config?: UnitConfig to RateCard with doc text about synthesized-on-read behavior.
Core Conversion / Data Shape
api/v3/handlers/plans/convert.go
Removed prior dynamic/package rejection helper; added ToAPIBillingRateCardUnitConfig to synthesize BillingUnitConfig from v1 Dynamic/Package prices and wired it into ToAPIBillingRateCard, returning errors on conversion failure.
Price Mapping
api/v3/handlers/plans/convert.go
ToAPIBillingPrice now converts v1 Dynamic -> unit amount "1" and v1 Package -> unit amount equal to package amount instead of returning conflicts.
API Wiring
api/v3/handlers/plans/list.go
LIST handler no longer filters out plans with v1 dynamic/package prices; all items are converted via ToAPIBillingPlan and appended to the response.
Unit Tests
api/v3/handlers/plans/convert_test.go
Replaced conflict-expectation tests with assertions for unit-price translation; added tests for ToAPIBillingRateCardUnitConfig (multiply/divide, conversion factors, rounding) and end-to-end ToAPIBillingRateCard behavior including commitments.
End-to-End Tests
e2e/plans_v3_test.go
New E2E test creates a v1 plan with dynamic and package rate cards and asserts v3 GET/LIST return synthesized unit_price and unit_config with correct operations, conversion factors, rounding, and preserved commitments; added helpers findRateCardByKey and assertUnitPriceAmount.

Sequence Diagram

sequenceDiagram
    participant Client
    participant v3API as "v3 API Handler"
    participant Conv as "Conversion Logic"
    participant Resp as "v3 Response"

    Client->>v3API: GET /Plan or LIST /Plans
    v3API->>Conv: ToAPIBillingPlan(v1Plan)
    Conv->>Conv: ToAPIBillingRateCard(v1RateCard)
    alt Dynamic price
        Conv->>Conv: ToAPIBillingRateCardUnitConfig() -> Multiply unit_config
        Conv->>Conv: ToAPIBillingPrice() -> unit_price (amount "1")
    else Package price
        Conv->>Conv: ToAPIBillingRateCardUnitConfig() -> Divide unit_config + ceiling rounding
        Conv->>Conv: ToAPIBillingPrice() -> unit_price (package amount)
    end
    Conv->>Resp: v3 rate card with unit_price & unit_config
    Resp->>Client: v3 API Response
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Suggested labels

area/billing

Suggested reviewers

  • tothandras
  • chrisgacsal
  • turip
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 45.45% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and specifically describes the main change: translating package and dynamic price types to unitconfig, which is the core feature across all modified files.
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.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/add-unitconfig-to-ratecards

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


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 and usage tips.

@rolosp rolosp force-pushed the feat/add-unitconfig-to-ratecards branch from 55bbffd to 85beb92 Compare May 6, 2026 18:02
@rolosp rolosp changed the title feat: convert package and dynamic price to unitconfig translation feat: package and dynamic price to unitconfig translation May 6, 2026
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
e2e/plans_v3_test.go (1)

607-638: 💤 Low value

Handy helpers — small naming nit.

findRateCardByKey and assertUnitPriceAmount are reusable across other v3 plan tests. If you anticipate more callers outside this file, consider moving them next to the other shared assert helpers (assertValidationCode, assertProblemDetail) so they're easy to discover. Totally optional.

🤖 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 `@e2e/plans_v3_test.go` around lines 607 - 638, The two helper functions
findRateCardByKey and assertUnitPriceAmount are reusable and should be moved
next to the other shared test helpers (e.g. where assertValidationCode and
assertProblemDetail live) so they’re easier to discover and reuse; relocate
these functions from e2e/plans_v3_test.go into the shared helpers test file in
the same package, keep their names and signatures (they can remain unexported),
update any import or test references if necessary, and run the tests to ensure
no package name or test visibility issues.
🤖 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.

Nitpick comments:
In `@e2e/plans_v3_test.go`:
- Around line 607-638: The two helper functions findRateCardByKey and
assertUnitPriceAmount are reusable and should be moved next to the other shared
test helpers (e.g. where assertValidationCode and assertProblemDetail live) so
they’re easier to discover and reuse; relocate these functions from
e2e/plans_v3_test.go into the shared helpers test file in the same package, keep
their names and signatures (they can remain unexported), update any import or
test references if necessary, and run the tests to ensure no package name or
test visibility issues.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 90c5ceba-81f3-4c90-a2de-a725fcff437e

📥 Commits

Reviewing files that changed from the base of the PR and between bf09b93 and 55bbffd.

⛔ Files ignored due to path filters (1)
  • api/v3/openapi.yaml is excluded by !**/openapi.yaml
📒 Files selected for processing (6)
  • api/spec/packages/aip/src/productcatalog/ratecard.tsp
  • api/v3/api.gen.go
  • api/v3/handlers/plans/convert.go
  • api/v3/handlers/plans/convert_test.go
  • api/v3/handlers/plans/list.go
  • e2e/plans_v3_test.go
💤 Files with no reviewable changes (1)
  • api/v3/handlers/plans/list.go

@rolosp rolosp force-pushed the feat/add-unitconfig-to-ratecards branch from 85beb92 to 97a4bf0 Compare May 6, 2026 18:14
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (4)
e2e/plans_v3_test.go (1)

463-605: 💤 Low value

Really nice translation e2e — covers the full read-side contract. 🎉

The test exercises both GET and LIST paths, asserts the synthesized unit price and unit config for both dynamic and package, and verifies commitments round-trip. The cross-reference back to convert.go in the doc comment is super helpful for future readers. The use of t.Context() on line 523 is also a nice match with the test-harness lifecycle guidance.

One small nit — when this test fails, the partially-created v1 plan will linger on the shared DB across runs (it uses a unique suffix so it won't collide, but it does accumulate). If you want to be tidy, either an archive+delete in a t.Cleanup after the create succeeds, or relying on the suite's broader cleanup, would help. Plenty of other tests here also don't clean up, so feel free to skip if that's the established pattern.

🤖 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 `@e2e/plans_v3_test.go` around lines 463 - 605, Test leaves created v1 plan in
shared DB on failures; add cleanup to remove it. After the successful create in
TestV3PlanReadTranslatesV1DynamicAndPackagePrices (the block that calls
v1.CreatePlanWithResponse and sets planID), register a t.Cleanup (or defer) that
deletes or archives the plan using planID (call the v1 client delete/archive
method or appropriate endpoint) so any partially-created plan is removed when
the test finishes; ensure you only register the cleanup after planID is set to a
non-empty value and reference planID and v1.* methods to locate where to add the
cleanup.
api/v3/handlers/plans/convert_test.go (1)

568-620: 💤 Low value

Great coverage for the new helper — one tiny gap.

You've covered nil/flat/unit/dynamic/package, which hits the main intent. As a small nice-to-have, you could add a tiered/graduated/volume case asserting unit_config stays nil — that would lock down the default: branch behavior and protect against someone accidentally extending the switch later.

t.Run("graduated price has no unit config", func(t *testing.T) {
    p := productcatalog.NewPriceFrom(productcatalog.TieredPrice{
        Mode:  productcatalog.GraduatedTieredPrice,
        Tiers: []productcatalog.PriceTier{},
    })

    result, err := ToAPIBillingRateCardUnitConfig(p)
    require.NoError(t, err)
    assert.Nil(t, result)
})
🤖 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 `@api/v3/handlers/plans/convert_test.go` around lines 568 - 620, Add a test
case inside TestToAPIBillingRateCardUnitConfig that constructs a
productcatalog.TieredPrice with Mode set to productcatalog.GraduatedTieredPrice
(and empty Tiers), calls ToAPIBillingRateCardUnitConfig with that price, asserts
no error, and asserts the returned unit config is nil to lock down the default:
branch behavior for tiered/graded prices.
api/v3/handlers/plans/convert.go (2)

154-190: 💤 Low value

Solid translation helper — one small thought on duplicated AsPackage/AsDynamic calls.

The synthesis logic reads cleanly and the contract is nicely scoped (only fires for dynamic/package, otherwise nil). One minor observation: this helper plus ToAPIBillingPrice each independently call p.AsPackage() / p.AsDynamic() for the same price during a single ToAPIBillingRateCard invocation. Not a hot path concern, but if you ever want to tighten things, you could fold the unit-config synthesis into a single switch in ToAPIBillingRateCard that destructures the price once and emits both the API price and the unit config together. Totally optional — the current split reads very clearly as-is.

🤖 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 `@api/v3/handlers/plans/convert.go` around lines 154 - 190, Duplicate
AsPackage/AsDynamic calls occur when ToAPIBillingRateCard invokes both
ToAPIBillingPrice and ToAPIBillingRateCardUnitConfig; refactor by collapsing
unit-config synthesis into ToAPIBillingRateCard so the price is destructured
once: in ToAPIBillingRateCard call p.AsDynamic()/p.AsPackage() a single time,
build the API price (used by ToAPIBillingPrice or inline) and simultaneously
create the *api.BillingUnitConfig (replacing ToAPIBillingRateCardUnitConfig),
returning/attaching both results; update or remove
ToAPIBillingRateCardUnitConfig and adjust callers accordingly so no duplicate
As*() calls occur.

175-185: 💤 Low value

Upstream v1 validation already guards against this. The PackagePrice.Validate() method explicitly checks that QuantityPerPackage is non-zero (openmeter/productcatalog/price.go:978-980), so bad historical rows with zero values can't actually exist in the first place. That said, if you want to be extra defensive here in the conversion path, adding a check for pkg.QuantityPerPackage.IsZero() before returning the config would be a nice belt-and-suspenders safeguard against any future mutations that might bypass validation.

🤖 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 `@api/v3/handlers/plans/convert.go` around lines 175 - 185, The conversion for
productcatalog.PackagePriceType should defensively check for a zero package
quantity before returning the BillingUnitConfig: after calling p.AsPackage() and
obtaining pkg, call pkg.QuantityPerPackage.IsZero() (or equivalent) and return
an error if true instead of constructing api.BillingUnitConfig, so functions
like productcatalog.PackagePriceType handling and api.BillingUnitConfig creation
(Operation: api.BillingUnitConfigOperationDivide, ConversionFactor:
pkg.QuantityPerPackage.String()) never proceed with a zero QuantityPerPackage
despite upstream validation in PackagePrice.Validate().
🤖 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.

Nitpick comments:
In `@api/v3/handlers/plans/convert_test.go`:
- Around line 568-620: Add a test case inside TestToAPIBillingRateCardUnitConfig
that constructs a productcatalog.TieredPrice with Mode set to
productcatalog.GraduatedTieredPrice (and empty Tiers), calls
ToAPIBillingRateCardUnitConfig with that price, asserts no error, and asserts
the returned unit config is nil to lock down the default: branch behavior for
tiered/graded prices.

In `@api/v3/handlers/plans/convert.go`:
- Around line 154-190: Duplicate AsPackage/AsDynamic calls occur when
ToAPIBillingRateCard invokes both ToAPIBillingPrice and
ToAPIBillingRateCardUnitConfig; refactor by collapsing unit-config synthesis
into ToAPIBillingRateCard so the price is destructured once: in
ToAPIBillingRateCard call p.AsDynamic()/p.AsPackage() a single time, build the
API price (used by ToAPIBillingPrice or inline) and simultaneously create the
*api.BillingUnitConfig (replacing ToAPIBillingRateCardUnitConfig),
returning/attaching both results; update or remove
ToAPIBillingRateCardUnitConfig and adjust callers accordingly so no duplicate
As*() calls occur.
- Around line 175-185: The conversion for productcatalog.PackagePriceType should
defensively check for a zero package quantity before returning the
BillingUnitConfig: after calling p.AsPackage() and obtaining pkg, call
pkg.QuantityPerPackage.IsZero() (or equivalent) and return an error if true
instead of constructing api.BillingUnitConfig, so functions like
productcatalog.PackagePriceType handling and api.BillingUnitConfig creation
(Operation: api.BillingUnitConfigOperationDivide, ConversionFactor:
pkg.QuantityPerPackage.String()) never proceed with a zero QuantityPerPackage
despite upstream validation in PackagePrice.Validate().

In `@e2e/plans_v3_test.go`:
- Around line 463-605: Test leaves created v1 plan in shared DB on failures; add
cleanup to remove it. After the successful create in
TestV3PlanReadTranslatesV1DynamicAndPackagePrices (the block that calls
v1.CreatePlanWithResponse and sets planID), register a t.Cleanup (or defer) that
deletes or archives the plan using planID (call the v1 client delete/archive
method or appropriate endpoint) so any partially-created plan is removed when
the test finishes; ensure you only register the cleanup after planID is set to a
non-empty value and reference planID and v1.* methods to locate where to add the
cleanup.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 07a88067-b1cd-42eb-b002-07d85e8ed7c8

📥 Commits

Reviewing files that changed from the base of the PR and between 55bbffd and 97a4bf0.

⛔ Files ignored due to path filters (1)
  • api/v3/openapi.yaml is excluded by !**/openapi.yaml
📒 Files selected for processing (6)
  • api/spec/packages/aip/src/productcatalog/ratecard.tsp
  • api/v3/api.gen.go
  • api/v3/handlers/plans/convert.go
  • api/v3/handlers/plans/convert_test.go
  • api/v3/handlers/plans/list.go
  • e2e/plans_v3_test.go
💤 Files with no reviewable changes (1)
  • api/v3/handlers/plans/list.go

@rolosp rolosp force-pushed the feat/add-unitconfig-to-ratecards branch from 97a4bf0 to 298e4c2 Compare May 7, 2026 08:11
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (2)
api/v3/handlers/plans/convert_test.go (1)

568-620: 💤 Low value

TestToAPIBillingRateCardUnitConfig — LGTM on the happy paths.

One small optional gap: there are no cases for graduated/volume tiered prices to confirm they produce a nil unit config. If a future change accidentally wires in tiered price handling, this would catch the regression early. Totally fine to leave for later, but it'd make the suite more bulletproof.

✨ Suggested additional cases
+	t.Run("graduated tiered price has no unit config", func(t *testing.T) {
+		p := productcatalog.NewPriceFrom(productcatalog.TieredPrice{
+			Mode:  productcatalog.GraduatedTieredPrice,
+			Tiers: []productcatalog.PriceTier{},
+		})
+
+		result, err := ToAPIBillingRateCardUnitConfig(p)
+		require.NoError(t, err)
+		assert.Nil(t, result)
+	})
+
+	t.Run("volume tiered price has no unit config", func(t *testing.T) {
+		p := productcatalog.NewPriceFrom(productcatalog.TieredPrice{
+			Mode:  productcatalog.VolumeTieredPrice,
+			Tiers: []productcatalog.PriceTier{},
+		})
+
+		result, err := ToAPIBillingRateCardUnitConfig(p)
+		require.NoError(t, err)
+		assert.Nil(t, result)
+	})
🤖 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 `@api/v3/handlers/plans/convert_test.go` around lines 568 - 620, Add tests
inside TestToAPIBillingRateCardUnitConfig to assert that tiered price types
return a nil unit config: create prices with
productcatalog.NewPriceFrom(productcatalog.GraduatedPrice{ /* minimal tiers */
}) and productcatalog.NewPriceFrom(productcatalog.VolumeTieredPrice{ /* minimal
tiers */ }), call ToAPIBillingRateCardUnitConfig on each, require.NoError(t,
err) and assert.Nil(t, result). This ensures ToAPIBillingRateCardUnitConfig (the
function under test) continues to return nil for graduated and volume-tiered
price types.
e2e/plans_v3_test.go (1)

628-638: ⚡ Quick win

Consider using apiv3.Numeric(want) for consistency with the rest of the file.

Since apiv3.Numeric is a type alias to string, the test will work fine as-is. However, the rest of the file (e.g., lines 544, 565, 595, 601) uses apiv3.Numeric("...") explicitly, so wrapping want in the same cast would make this helper more consistent:

Optional consistency improvement
-	assert.Equal(t, want, unit.Amount)
+	assert.Equal(t, apiv3.Numeric(want), unit.Amount)
🤖 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 `@e2e/plans_v3_test.go` around lines 628 - 638, The helper
assertUnitPriceAmount should compare the unit.Amount using the same
apiv3.Numeric typed value used elsewhere; inside assertUnitPriceAmount (function
name) wrap the want string with apiv3.Numeric(want) when asserting against
unit.Amount so the assertion uses apiv3.Numeric consistently with other tests
that set numeric values (rc.Price, AsBillingPriceUnit, BillingRateCard types
remain unchanged).
🤖 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.

Nitpick comments:
In `@api/v3/handlers/plans/convert_test.go`:
- Around line 568-620: Add tests inside TestToAPIBillingRateCardUnitConfig to
assert that tiered price types return a nil unit config: create prices with
productcatalog.NewPriceFrom(productcatalog.GraduatedPrice{ /* minimal tiers */
}) and productcatalog.NewPriceFrom(productcatalog.VolumeTieredPrice{ /* minimal
tiers */ }), call ToAPIBillingRateCardUnitConfig on each, require.NoError(t,
err) and assert.Nil(t, result). This ensures ToAPIBillingRateCardUnitConfig (the
function under test) continues to return nil for graduated and volume-tiered
price types.

In `@e2e/plans_v3_test.go`:
- Around line 628-638: The helper assertUnitPriceAmount should compare the
unit.Amount using the same apiv3.Numeric typed value used elsewhere; inside
assertUnitPriceAmount (function name) wrap the want string with
apiv3.Numeric(want) when asserting against unit.Amount so the assertion uses
apiv3.Numeric consistently with other tests that set numeric values (rc.Price,
AsBillingPriceUnit, BillingRateCard types remain unchanged).

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: c70692fe-2d69-4750-abc8-6afb1a2de4a9

📥 Commits

Reviewing files that changed from the base of the PR and between 97a4bf0 and 298e4c2.

⛔ Files ignored due to path filters (1)
  • api/v3/openapi.yaml is excluded by !**/openapi.yaml
📒 Files selected for processing (6)
  • api/spec/packages/aip/src/productcatalog/ratecard.tsp
  • api/v3/api.gen.go
  • api/v3/handlers/plans/convert.go
  • api/v3/handlers/plans/convert_test.go
  • api/v3/handlers/plans/list.go
  • e2e/plans_v3_test.go
💤 Files with no reviewable changes (1)
  • api/v3/handlers/plans/list.go
🚧 Files skipped from review as they are similar to previous changes (2)
  • api/spec/packages/aip/src/productcatalog/ratecard.tsp
  • api/v3/handlers/plans/convert.go

@rolosp rolosp force-pushed the feat/add-unitconfig-to-ratecards branch from 298e4c2 to 604fd3e Compare May 7, 2026 10:13
@rolosp rolosp force-pushed the feat/add-unitconfig-to-ratecards branch from 604fd3e to 0c46558 Compare May 12, 2026 09:21
@rolosp rolosp force-pushed the feat/add-unitconfig-to-ratecards branch from 0c46558 to 7c04d41 Compare May 12, 2026 09:27
@tothandras tothandras force-pushed the feat/add-unitconfig-to-ratecards branch from 7c04d41 to 7d25b83 Compare May 12, 2026 09:30
@rolosp rolosp force-pushed the feat/add-unitconfig-to-ratecards branch from 7d25b83 to 99c1e93 Compare May 12, 2026 13:07
@rolosp rolosp force-pushed the feat/add-unitconfig-to-ratecards branch from 476c4e0 to b7f7e1a Compare May 14, 2026 08:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

release-note/feature Release note: Exciting New Features

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants