Skip to content

Conversation

@chrisgacsal
Copy link
Collaborator

@chrisgacsal chrisgacsal commented Jul 11, 2025

Overview

Add annotations to Customer.

Summary by CodeRabbit

  • New Features

    • Added a new read-only "annotations" field to the Customer entity, allowing storage and retrieval of system-managed key-value pairs.
    • The "annotations" field is available via the API and included in API documentation and client libraries.
  • Database

    • Introduced a new JSONB "annotations" column to the customers table, with a GIN index for efficient querying.
  • Bug Fixes

    • None.
  • Documentation

    • Updated API documentation to reflect the new "annotations" field in the Customer schema.

@chrisgacsal chrisgacsal self-assigned this Jul 11, 2025
@chrisgacsal chrisgacsal added the release-note/misc Miscellaneous changes label Jul 11, 2025
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jul 11, 2025

📝 Walkthrough

Walkthrough

A new "annotations" field was introduced to the Customer entity across the API, database schema, and codebase. This field is a set of key-value pairs managed by the system, read-only for users, and supports storage, migration, and API exposure. Supporting logic, migration scripts, and OpenAPI specifications were updated accordingly.

Changes

Files/Paths Change Summary
api/client/javascript/src/client/schemas.ts Added optional readonly annotations property to Customer interface.
api/openapi.cloud.yaml, api/openapi.yaml Added read-only annotations property referencing Annotations schema to Customer in OpenAPI specs.
api/spec/src/customer.tsp Added optional, read-only annotations property to Customer model.
openmeter/customer/customer.go Added optional Annotation field to Customer and CustomerMutate structs.
openmeter/customer/adapter/customer.go, openmeter/customer/adapter/entitymapping.go Updated creation, update, and entity mapping logic to handle Annotation/Annotations fields.
openmeter/customer/httpdriver/apimapping.go Added helper functions for annotations/metadata conversion; updated API mapping to support annotations.
openmeter/ent/db/customer.go, openmeter/ent/db/customer/customer.go Added Annotations field to Customer struct; updated scan, assign, and string methods; added field constant.
openmeter/ent/db/customer/where.go Added predicates for checking if annotations is nil or not nil.
openmeter/ent/db/customer_create.go, openmeter/ent/db/customer_update.go Added builder/setter/clearer methods for annotations in create, update, and upsert flows.
openmeter/ent/db/migrate/schema.go Added nullable JSONB annotations column and GIN index to customers table; updated index column positions.
openmeter/ent/db/mutation.go Integrated annotations into mutation tracking with new field, getters/setters, and state management methods.
openmeter/ent/db/setorclear.go Added unified SetOrClearAnnotations methods for update types.
openmeter/ent/schema/customer.go Added AnnotationsMixin to Customer schema mixins.
tools/migrate/migrations/20250711121333_customer_annotations.up.sql Migration: Adds annotations JSONB column and GIN index to customers table.
tools/migrate/migrations/20250711121333_customer_annotations.down.sql Migration: Removes annotations column and index from customers table (rollback).

📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e5a611f and 2599931.

⛔ Files ignored due to path filters (1)
  • tools/migrate/migrations/atlas.sum is excluded by !**/*.sum
📒 Files selected for processing (19)
  • api/client/javascript/src/client/schemas.ts (1 hunks)
  • api/openapi.cloud.yaml (1 hunks)
  • api/openapi.yaml (1 hunks)
  • api/spec/src/customer.tsp (1 hunks)
  • openmeter/customer/adapter/customer.go (2 hunks)
  • openmeter/customer/adapter/entitymapping.go (2 hunks)
  • openmeter/customer/customer.go (2 hunks)
  • openmeter/customer/httpdriver/apimapping.go (2 hunks)
  • openmeter/ent/db/customer.go (4 hunks)
  • openmeter/ent/db/customer/customer.go (2 hunks)
  • openmeter/ent/db/customer/where.go (1 hunks)
  • openmeter/ent/db/customer_create.go (5 hunks)
  • openmeter/ent/db/customer_update.go (4 hunks)
  • openmeter/ent/db/migrate/schema.go (3 hunks)
  • openmeter/ent/db/mutation.go (10 hunks)
  • openmeter/ent/db/setorclear.go (1 hunks)
  • openmeter/ent/schema/customer.go (1 hunks)
  • tools/migrate/migrations/20250711121333_customer_annotations.down.sql (1 hunks)
  • tools/migrate/migrations/20250711121333_customer_annotations.up.sql (1 hunks)
✅ Files skipped from review due to trivial changes (3)
  • tools/migrate/migrations/20250711121333_customer_annotations.down.sql
  • tools/migrate/migrations/20250711121333_customer_annotations.up.sql
  • openmeter/ent/db/customer/customer.go
🚧 Files skipped from review as they are similar to previous changes (16)
  • openmeter/ent/schema/customer.go
  • openmeter/customer/adapter/entitymapping.go
  • api/spec/src/customer.tsp
  • openmeter/customer/adapter/customer.go
  • openmeter/ent/db/setorclear.go
  • openmeter/customer/customer.go
  • api/openapi.cloud.yaml
  • openmeter/ent/db/customer.go
  • api/openapi.yaml
  • api/client/javascript/src/client/schemas.ts
  • openmeter/customer/httpdriver/apimapping.go
  • openmeter/ent/db/migrate/schema.go
  • openmeter/ent/db/customer_update.go
  • openmeter/ent/db/customer/where.go
  • openmeter/ent/db/customer_create.go
  • openmeter/ent/db/mutation.go
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (11)
  • GitHub Check: CI
  • GitHub Check: E2E
  • GitHub Check: Quickstart
  • GitHub Check: Commit hooks
  • GitHub Check: Lint
  • GitHub Check: Developer environment
  • GitHub Check: Test
  • GitHub Check: Build
  • GitHub Check: Migration Checks
  • GitHub Check: Analyze (go)
  • GitHub Check: Analyze (javascript)
✨ Finishing Touches
  • 📝 Generate Docstrings

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
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@chrisgacsal chrisgacsal marked this pull request as ready for review July 11, 2025 11:43
@chrisgacsal chrisgacsal requested a review from a team as a code owner July 11, 2025 11:43
Copy link
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.

Actionable comments posted: 1

🧹 Nitpick comments (4)
openmeter/ent/db/runtime.go (1)

861-863: Index-based access is fragile—regenerate on every schema change

customerFields[3] is hard-wired to the current position of the annotations field; if the field order changes (e.g., another column is inserted before it), the application will panic at init time. This is fine for code-generated files, but make sure the Ent codegen step is rerun whenever you touch Customer’s schema so the index stays in sync.

api/openapi.yaml (1)

13503-13508: Explicitly mark annotations as nullable and enrich the example

Add nullable: true (or set a default {}) so generators don’t assume the property is always present and populated. Including a small example under the example: block will make the docs clearer.

           title: Annotations
+          nullable: true            # field may legitimately be null / omitted
           readOnly: true
openmeter/customer/httpdriver/apimapping.go (2)

82-95: Remove redundant length check in FromMetadata function.

The function has an unnecessary duplicate check for empty metadata.

 func FromMetadata(metadata models.Metadata) *api.Metadata {
 	if len(metadata) == 0 {
 		return nil
 	}
 
 	result := make(api.Metadata)
-	if len(metadata) > 0 {
-		for k, v := range metadata {
-			result[k] = v
-		}
-	}
+	for k, v := range metadata {
+		result[k] = v
+	}
 
 	return &result
 }

97-110: Remove redundant length check in FromAnnotations function.

The function has the same unnecessary duplicate check as FromMetadata.

 func FromAnnotations(annotations models.Annotations) *api.Annotations {
 	if len(annotations) == 0 {
 		return nil
 	}
 
 	result := make(api.Annotations)
-	if len(annotations) > 0 {
-		for k, v := range annotations {
-			result[k] = v
-		}
-	}
+	for k, v := range annotations {
+		result[k] = v
+	}
 
 	return &result
 }
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d9ef3e6 and e5a611f.

⛔ Files ignored due to path filters (1)
  • tools/migrate/migrations/atlas.sum is excluded by !**/*.sum
📒 Files selected for processing (21)
  • api/client/javascript/src/client/schemas.ts (1 hunks)
  • api/openapi.cloud.yaml (1 hunks)
  • api/openapi.yaml (1 hunks)
  • api/spec/src/customer.tsp (1 hunks)
  • openmeter/customer/adapter/customer.go (2 hunks)
  • openmeter/customer/adapter/entitymapping.go (2 hunks)
  • openmeter/customer/customer.go (2 hunks)
  • openmeter/customer/httpdriver/apimapping.go (2 hunks)
  • openmeter/ent/db/customer.go (4 hunks)
  • openmeter/ent/db/customer/customer.go (5 hunks)
  • openmeter/ent/db/customer/where.go (1 hunks)
  • openmeter/ent/db/customer_create.go (9 hunks)
  • openmeter/ent/db/customer_update.go (4 hunks)
  • openmeter/ent/db/migrate/schema.go (1 hunks)
  • openmeter/ent/db/mutation.go (10 hunks)
  • openmeter/ent/db/predicate/predicate.go (1 hunks)
  • openmeter/ent/db/runtime.go (1 hunks)
  • openmeter/ent/db/setorclear.go (1 hunks)
  • openmeter/ent/schema/customer.go (2 hunks)
  • tools/migrate/migrations/20250711113121_customer_annotations.down.sql (1 hunks)
  • tools/migrate/migrations/20250711113121_customer_annotations.up.sql (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
openmeter/ent/db/predicate/predicate.go (1)
Learnt from: chrisgacsal
PR: openmeterio/openmeter#2692
File: openmeter/productcatalog/plan/adapter/mapping.go:64-74
Timestamp: 2025-04-20T11:15:07.499Z
Learning: In the OpenMeter codebase, Ent's edge methods ending in "OrErr" (like AddonsOrErr()) only return NotLoadedError when the edge wasn't loaded, and cannot return DB errors. Simple err != nil checks are sufficient for these methods.
🧬 Code Graph Analysis (7)
openmeter/customer/customer.go (3)
api/client/javascript/src/client/schemas.ts (1)
  • Annotations (10350-10350)
api/api.gen.go (1)
  • Annotations (1008-1008)
api/client/go/client.gen.go (1)
  • Annotations (923-923)
openmeter/customer/adapter/entitymapping.go (2)
api/api.gen.go (1)
  • Annotations (1008-1008)
api/client/go/client.gen.go (1)
  • Annotations (923-923)
openmeter/ent/db/setorclear.go (1)
openmeter/ent/db/customer_update.go (2)
  • CustomerUpdate (26-30)
  • CustomerUpdateOne (875-880)
openmeter/ent/db/runtime.go (2)
openmeter/ent/db/customer/customer.go (1)
  • ValueScanner (152-154)
openmeter/ent/db/subscriptionitem/subscriptionitem.go (1)
  • ValueScanner (158-164)
openmeter/ent/db/customer_update.go (1)
openmeter/ent/db/customer/customer.go (2)
  • ValueScanner (152-154)
  • FieldAnnotations (53-53)
openmeter/ent/db/customer/customer.go (3)
api/api.gen.go (1)
  • Annotations (1008-1008)
api/client/go/client.gen.go (1)
  • Annotations (923-923)
openmeter/ent/db/app/app.go (1)
  • OrderOption (140-140)
openmeter/ent/db/customer.go (3)
api/api.gen.go (1)
  • Annotations (1008-1008)
api/client/go/client.gen.go (1)
  • Annotations (923-923)
openmeter/ent/db/customer/customer.go (2)
  • FieldAnnotations (53-53)
  • ValueScanner (152-154)
🔇 Additional comments (45)
tools/migrate/migrations/20250711113121_customer_annotations.up.sql (1)

1-2: LGTM! Safe migration implementation.

The migration correctly adds a nullable JSONB column for storing annotations. Using JSONB is appropriate for key-value data and adding a nullable column is safe for existing records.

tools/migrate/migrations/20250711113121_customer_annotations.down.sql (1)

1-2: LGTM! Proper rollback migration.

The down migration correctly reverses the up migration by dropping the annotations column.

openmeter/ent/db/customer/where.go (1)

1285-1293: LGTM! Generated predicate functions follow established patterns.

The new AnnotationsIsNil and AnnotationsNotNil functions are properly generated and consistent with other predicate functions in the file, enabling filtering customers based on annotations presence.

openmeter/customer/customer.go (2)

24-24: LGTM! Field naming follows API contract.

The Annotation field with JSON tag "annotations,omitempty" correctly aligns with the API specification. The singular field name with plural JSON tag is consistent with how this field is exposed in the API.


57-57: LGTM! Consistent annotation field in mutation struct.

The CustomerMutate struct correctly includes the same Annotation field with consistent typing and JSON serialization. No additional validation is needed since annotations are system-managed.

api/client/javascript/src/client/schemas.ts (1)

3677-3681: LGTM! Well-implemented schema addition.

The new annotations property is correctly implemented:

  • Properly typed with components['schemas']['Annotations']
  • Marked as readonly and optional for backward compatibility
  • Clear JSDoc documentation explaining its purpose and restrictions
  • Consistent formatting with the existing codebase
api/spec/src/customer.tsp (1)

295-301: LGTM! Clean implementation of read-only annotations field.

The annotations field is properly implemented with:

  • Read-only visibility restriction preventing user modification
  • Clear documentation explaining system management
  • Consistent optional field pattern
  • Proper TypeSpec annotations
openmeter/customer/adapter/entitymapping.go (2)

29-33: LGTM! Proper handling of optional annotations field.

The logic correctly handles the optional annotations field by checking for non-empty data before creating a pointer.


51-51: Ignore field name consistency suggestion
The Customer domain model in openmeter/customer/customer.go defines the field as Annotation (singular) with a JSON tag of "annotations". The mapping in openmeter/customer/adapter/entitymapping.go correctly uses the Go struct field name Annotation. No change is needed.

Likely an incorrect or invalid review comment.

openmeter/ent/schema/customer.go (2)

14-14: LGTM! Proper import addition for models package.


38-43: LGTM – AnnotationsValueScanner Verified

Verified that AnnotationsValueScanner is defined in openmeter/ent/schema/notification.go, correctly implementing JSON marshalling and unmarshalling. No further changes needed—approving these schema updates.

openmeter/ent/db/predicate/predicate.go (1)

155-164: LGTM! Consistent predicate error handling pattern.

The CustomerOrErr function follows the established pattern used by other predicate types in the file, providing consistent error handling for Customer predicates.

api/openapi.yaml (1)

13505-13505: Component Exists: Annotations Found in components.schemas

I’ve confirmed that the Annotations schema is defined under components.schemas in api/openapi.yaml (around line 11505). The reference

- $ref: '#/components/schemas/Annotations'

is valid and the spec will compile as expected.

openmeter/ent/db/setorclear.go (1)

1920-1932: LGTM! Clean implementation following established patterns.

The new SetOrClearAnnotations methods for both CustomerUpdate and CustomerUpdateOne follow the exact same pattern as all other methods in this generated file. The implementation correctly handles the nil check and delegates to the appropriate ClearAnnotations() or SetAnnotations() methods. The type signature *map[string]interface{} is consistent with other annotation methods in the codebase.

api/openapi.cloud.yaml (1)

13345-13350: Mark annotations as nullable in the schema

The OpenAPI spec describes annotations as an optional, system-managed field. If the backend ever omits this property or returns null when no annotations exist, strict clients and validators will reject the response unless the schema allows null. Please confirm your API’s behavior:

  • If the response sometimes omits annotations or returns null, add nullable: true.
  • If the backend always returns an empty object ({}), you can leave it non-nullable.

Affected location: api/openapi.cloud.yaml, around lines 13345–13350

Suggested diff:

         annotations:
           allOf:
             - $ref: '#/components/schemas/Annotations'
+          nullable: true
           description: Set of key-value pairs managed by the system. Cannot be modified by user.
           title: Annotations
           readOnly: true
openmeter/customer/adapter/customer.go (2)

171-173: LGTM! Annotation handling follows established patterns.

The implementation correctly follows the same pattern used for metadata handling, with proper nil checking and field mapping.


452-456: LGTM! Update annotation handling is properly implemented.

The implementation correctly handles both setting and clearing annotations based on input presence, following the same pattern as metadata handling.

openmeter/ent/db/customer.go (4)

58-59: LGTM! Annotations field properly added to Customer struct.

The field definition follows established patterns with correct type and JSON tags.


141-142: LGTM! Annotations field properly integrated into scanValues.

The implementation correctly uses the ValueScanner for type conversion, following established patterns.


279-284: LGTM! Annotations field properly integrated into assignValues with error handling.

The implementation correctly uses the ValueScanner for type conversion and includes proper error handling.


418-420: LGTM! Annotations field properly added to String method.

The implementation correctly includes the annotations field in the string representation, following established patterns.

openmeter/ent/db/customer/customer.go (5)

10-10: LGTM! Import added for ValueScanner functionality.

The field import is necessary for the ValueScanner struct and follows established patterns.


52-53: LGTM! FieldAnnotations constant properly defined.

The constant follows the established naming pattern and is correctly defined.


123-123: LGTM! FieldAnnotations properly added to Columns slice.

The field is correctly added to the columns list, maintaining consistency with other fields.


151-154: LGTM! ValueScanner struct properly defined for annotations.

The ValueScanner is correctly defined with the appropriate type for JSON data handling.


245-248: LGTM! ByAnnotations ordering function properly implemented.

The ordering function follows established patterns and is correctly implemented.

openmeter/ent/db/customer_update.go (4)

310-320: LGTM! SetAnnotations and ClearAnnotations methods properly implemented.

The methods follow established patterns and correctly handle setting and clearing annotations.


1154-1164: LGTM! SetAnnotations and ClearAnnotations methods properly implemented for CustomerUpdateOne.

The methods follow established patterns and are consistent with the CustomerUpdate implementation.


643-652: LGTM! Annotations handling properly implemented in sqlSave method.

The implementation correctly handles both setting and clearing annotations with proper error handling and type conversion.


1517-1526: LGTM! Annotations handling properly implemented in CustomerUpdateOne sqlSave method.

The implementation is consistent with the CustomerUpdate approach and correctly handles both setting and clearing annotations with proper error handling.

openmeter/customer/httpdriver/apimapping.go (1)

125-126: No changes needed: Customer.Annotation is correctly mapped to api.Annotations
The domain Customer struct defines its annotations field as Annotation (pointer to models.Annotations), and the call to FromAnnotations(lo.FromPtr(c.Annotation)) correctly converts that internal field into the API’s plural Annotations. Although other domain types use a field named Annotations, this mapping is consistent with the Customer model as defined—no rename or code update is required here.

openmeter/ent/db/customer_create.go (4)

247-251: Generated SetAnnotations method looks correct.

The method properly sets annotations through the mutation object with the correct type map[string]interface{}.


431-434: Improved error handling in createSpec method.

The changes properly handle errors from the createSpec method by updating the return signature and propagating errors in the call sites.

Also applies to: 453-453


531-538: Annotations field handling with proper value scanning.

The implementation correctly uses the value scanner for annotations serialization and handles potential conversion errors appropriately.


929-945: Complete upsert support for annotations.

All upsert builders (CustomerUpsert, CustomerUpsertOne, CustomerUpsertBulk) include the full set of annotations methods: SetAnnotations, UpdateAnnotations, and ClearAnnotations.

Also applies to: 1302-1321, 1848-1867

openmeter/ent/db/mutation.go (10)

28766-28766: LGTM: Field declaration follows the established pattern.

The annotations field is properly declared as a nullable pointer to map[string]interface{}, which is consistent with other optional fields in the struct.


29672-29719: LGTM: Comprehensive annotations field support implementation.

The implementation provides complete mutation support for the annotations field:

  • Proper setter/getter methods with null safety
  • Correct error handling in OldAnnotations() for operation type validation
  • Appropriate clearing and reset functionality
  • Consistent with existing field patterns

The type checking and pointer handling are implemented correctly.


30010-30010: LGTM: Field count updated correctly.

The field count is properly incremented from 17 to 18 to accommodate the new annotations field.


30062-30064: LGTM: Annotations field included in Fields() method.

The annotations field is correctly appended to the fields slice when present, following the same pattern as other optional fields.


30107-30108: LGTM: Annotations case added to Field() method.

The annotations field case is properly handled in the Field() method, returning the result of Annotations() getter.


30152-30153: LGTM: Annotations case added to OldField() method.

The annotations field case is correctly handled in the OldField() method, calling OldAnnotations() which includes proper error handling.


30282-30288: LGTM: Type-safe field setting for annotations.

The SetField() method properly handles the annotations field with:

  • Correct type assertion to map[string]interface{}
  • Appropriate error message on type mismatch
  • Consistent error handling pattern

30358-30360: LGTM: Annotations included in cleared fields check.

The ClearedFields() method correctly includes the annotations field when it has been cleared, maintaining consistency with other nullable fields.


30414-30416: LGTM: Annotations clearing support added.

The ClearField() method properly handles the annotations field case by calling ClearAnnotations(), consistent with other nullable fields.


30476-30478: LGTM: Annotations reset support added.

The ResetField() method correctly handles the annotations field case by calling ResetAnnotations(), following the established pattern.

@chrisgacsal chrisgacsal force-pushed the feat/customer-annotations branch from e5a611f to 2599931 Compare July 11, 2025 12:17
@chrisgacsal chrisgacsal merged commit 1670e68 into main Jul 11, 2025
22 checks passed
@chrisgacsal chrisgacsal deleted the feat/customer-annotations branch July 11, 2025 12:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

release-note/misc Miscellaneous changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants