Skip to content

introduce VMAnomalyConfig#1472

Merged
AndrewChubatiuk merged 9 commits intomasterfrom
introduce-vmanomalymodel
Apr 17, 2026
Merged

introduce VMAnomalyConfig#1472
AndrewChubatiuk merged 9 commits intomasterfrom
introduce-vmanomalymodel

Conversation

@AndrewChubatiuk
Copy link
Copy Markdown
Contributor

@AndrewChubatiuk AndrewChubatiuk commented Jul 17, 2025

starting 1.25.0 anomaly supports hot-reload, and this PR introduces VMAnomalyConfig CR, that allows to add extra models, schedulers and queries for VMAnomaly dynamic configuration

@AndrewChubatiuk AndrewChubatiuk marked this pull request as draft July 17, 2025 08:34
@AndrewChubatiuk AndrewChubatiuk force-pushed the introduce-vmanomalymodel branch 2 times, most recently from 7b569bb to a7fc951 Compare July 17, 2025 09:39
@AndrewChubatiuk AndrewChubatiuk marked this pull request as ready for review July 17, 2025 09:39
@AndrewChubatiuk AndrewChubatiuk requested a review from zekker6 July 17, 2025 09:39
@AndrewChubatiuk AndrewChubatiuk force-pushed the introduce-vmanomalymodel branch 3 times, most recently from 840964f to 9e5ab0f Compare July 17, 2025 10:47
f41gh7
f41gh7 previously requested changes Jul 18, 2025
Copy link
Copy Markdown
Collaborator

@f41gh7 f41gh7 left a comment

Choose a reason for hiding this comment

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

It's required to add documentation in first place. Is it possible that model could interfere on each other? Is it required to config VMAnomaly itself somehow? What is a relations between VMAnomaly and VMAnomalyModel?

Currently it's not possible to use this new API.

Also, I suggest to add -configCheckInterval to the vmanomaly in the same way as other components have it. It solves configuration reload without need of external config reloaders.

@AndrewChubatiuk
Copy link
Copy Markdown
Contributor Author

AndrewChubatiuk commented Jul 18, 2025

removed config reloader since python watchdog, which implements hot reload listens to fs events

@AndrewChubatiuk AndrewChubatiuk force-pushed the introduce-vmanomalymodel branch from 0ec9f87 to 1ba5e13 Compare July 18, 2025 12:20
@AndrewChubatiuk AndrewChubatiuk force-pushed the introduce-vmanomalymodel branch from 1ba5e13 to 4558e7c Compare July 29, 2025 13:19
@AndrewChubatiuk AndrewChubatiuk changed the title introduce VMAnomalyModel introduce VMAnomalyModel and VMAnomalyScheduler Jul 29, 2025
@AndrewChubatiuk
Copy link
Copy Markdown
Contributor Author

added scheduler CR, added docs

@AndrewChubatiuk AndrewChubatiuk force-pushed the introduce-vmanomalymodel branch 5 times, most recently from 1b8eb91 to 2216f0a Compare July 29, 2025 14:58
@AndrewChubatiuk AndrewChubatiuk force-pushed the introduce-vmanomalymodel branch 2 times, most recently from 66eac73 to bfc5203 Compare October 7, 2025 08:05
@AndrewChubatiuk AndrewChubatiuk force-pushed the introduce-vmanomalymodel branch 5 times, most recently from cdea53b to 5914c18 Compare October 21, 2025 13:33

This comment was marked as outdated.

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 36 out of 36 changed files in this pull request and generated no new comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@AndrewChubatiuk AndrewChubatiuk force-pushed the introduce-vmanomalymodel branch from 9d58b90 to 11c333c Compare January 14, 2026 17:05
@AndrewChubatiuk AndrewChubatiuk force-pushed the introduce-vmanomalymodel branch from 11c333c to bf10354 Compare April 2, 2026 13:09
@AndrewChubatiuk AndrewChubatiuk changed the title introduce VMAnomalyModel and VMAnomalyScheduler introduce VMAnomalyConfig Apr 2, 2026
@AndrewChubatiuk AndrewChubatiuk force-pushed the introduce-vmanomalymodel branch from c53d6a0 to 21aa85c Compare April 2, 2026 15:15
Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai Bot left a comment

Choose a reason for hiding this comment

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

8 issues found across 31 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="internal/controller/operator/vmanomalyconfig_controller_test.go">

<violation number="1" location="internal/controller/operator/vmanomalyconfig_controller_test.go:47">
P2: Fail fast on non-NotFound errors in test setup instead of silently ignoring them.</violation>
</file>

<file name="docs/CHANGELOG.md">

<violation number="1" location="docs/CHANGELOG.md:34">
P1: Custom agent: **Changelog Review Agent**

This entry is missing the mandatory issue/PR reference link required by the changelog structure.</violation>

<violation number="2" location="docs/CHANGELOG.md:223">
P2: This changelog entry is duplicated and appears in the wrong release section (`v0.64.0` and `v0.65.0`), which makes release notes inaccurate.</violation>

<violation number="3" location="docs/CHANGELOG.md:223">
P1: Custom agent: **Changelog Review Agent**

New changelog entries must be added only to `tip`; this line adds a new BUGFIX entry in a released section, which violates placement requirements.</violation>
</file>

<file name="internal/controller/operator/vmanomalyconfig_controller.go">

<violation number="1" location="internal/controller/operator/vmanomalyconfig_controller.go:118">
P2: Propagate the CreateOrUpdateConfig error so reconcile fails and requeues instead of silently succeeding.</violation>
</file>

<file name="internal/controller/operator/factory/vmanomaly/config/config.go">

<violation number="1" location="internal/controller/operator/factory/vmanomaly/config/config.go:288">
P1: Writing merged model entries into `c.Models` can panic when the base config omits `models` (nil map). Initialize the map before assignment.</violation>

<violation number="2" location="internal/controller/operator/factory/vmanomaly/config/config.go:292">
P1: Writing merged scheduler entries into `c.Schedulers` can panic when the base config omits `schedulers` (nil map). Initialize the map before assignment.</violation>
</file>

<file name="internal/controller/operator/factory/vmanomaly/config/config_test.go">

<violation number="1" location="internal/controller/operator/factory/vmanomaly/config/config_test.go:714">
P2: The new external-config test sets `ConfigNamespaceSelector` but doesn't create a matching labeled Namespace object, so no `VMAnomalyConfig` can be selected in this setup.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review, or fix all with cubic.

Comment thread internal/controller/operator/factory/vmanomaly/config/config.go
Comment thread internal/controller/operator/factory/vmanomaly/config/config.go
Comment thread docs/CHANGELOG.md
Comment thread docs/CHANGELOG.md Outdated
BeforeEach(func() {
By("creating the custom resource for the Kind VMAnomalyConfig")
err := k8sClient.Get(ctx, typeNamespacedName, vmanomalyconfig)
if err != nil && k8serrors.IsNotFound(err) {
Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai Bot Apr 2, 2026

Choose a reason for hiding this comment

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

P2: Fail fast on non-NotFound errors in test setup instead of silently ignoring them.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At internal/controller/operator/vmanomalyconfig_controller_test.go, line 47:

<comment>Fail fast on non-NotFound errors in test setup instead of silently ignoring them.</comment>

<file context>
@@ -0,0 +1,83 @@
+		BeforeEach(func() {
+			By("creating the custom resource for the Kind VMAnomalyConfig")
+			err := k8sClient.Get(ctx, typeNamespacedName, vmanomalyconfig)
+			if err != nil && k8serrors.IsNotFound(err) {
+				resource := &vmv1.VMAnomalyConfig{
+					ObjectMeta: metav1.ObjectMeta{
</file context>
Fix with Cubic

Comment thread docs/CHANGELOG.md Outdated
}
}

if err := vmanomaly.CreateOrUpdateConfig(ctx, r, item, &instance); err != nil {
Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai Bot Apr 2, 2026

Choose a reason for hiding this comment

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

P2: Propagate the CreateOrUpdateConfig error so reconcile fails and requeues instead of silently succeeding.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At internal/controller/operator/vmanomalyconfig_controller.go, line 118:

<comment>Propagate the CreateOrUpdateConfig error so reconcile fails and requeues instead of silently succeeding.</comment>

<file context>
@@ -0,0 +1,136 @@
+			}
+		}
+
+		if err := vmanomaly.CreateOrUpdateConfig(ctx, r, item, &instance); err != nil {
+			l.Error(err, "failed to update vmanomaly config")
+		}
</file context>
Fix with Cubic

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 31 out of 31 changed files in this pull request and generated 7 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread internal/controller/operator/factory/vmanomaly/config/config.go
Comment on lines +95 to +96
parentObject := fmt.Sprintf("%s.%s.vmanomaly", cr.Name, cr.Namespace)
return reconcile.StatusForChildObjects(ctx, rclient, parentObject, []*vmv1.VMAnomalyConfig{childObject})
Copy link

Copilot AI Apr 3, 2026

Choose a reason for hiding this comment

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

UpdateStatusesForChildObjects updates status using the childObject pointer passed by the caller. Since ParsedObjects.selectConfigs builds its own object instances, validation errors recorded via ChildObjects.ForEachCollectSkipInvalid won't be reflected in this childObject, so the condition may be marked applied even when this config was rejected (collision/unmarshal/etc). Consider looking up the matching object via pos.configs.Get(childObject) (and skipping update if it isn't selected) or updating statuses for pos.configs.All() when appropriate.

Suggested change
parentObject := fmt.Sprintf("%s.%s.vmanomaly", cr.Name, cr.Namespace)
return reconcile.StatusForChildObjects(ctx, rclient, parentObject, []*vmv1.VMAnomalyConfig{childObject})
selectedChildObject := pos.configs.Get(childObject)
if selectedChildObject == nil {
return nil
}
parentObject := fmt.Sprintf("%s.%s.vmanomaly", cr.Name, cr.Namespace)
return reconcile.StatusForChildObjects(ctx, rclient, parentObject, []*vmv1.VMAnomalyConfig{selectedChildObject})

Copilot uses AI. Check for mistakes.
Comment on lines +126 to +131
func (r *VMAnomalyConfigReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr).
For(&vmv1.VMAnomalyConfig{}).
WithEventFilter(predicate.TypedGenerationChangedPredicate[client.Object]{}).
WithOptions(getDefaultOptions()).
Complete(r)
Copy link

Copilot AI Apr 3, 2026

Choose a reason for hiding this comment

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

SetupWithManager uses GenerationChangedPredicate, but this controller's Reconcile() contains deletion-specific behavior based on DeletionTimestamp. DeletionTimestamp updates do not change generation, so the reconcile that should remove the config from VMAnomaly instances may never run. Use a predicate that allows DeletionTimestamp/resourceVersion changes (or add a finalizer and react to the finalizer update) so delete flows are handled before the object disappears.

Copilot uses AI. Check for mistakes.
Comment on lines +118 to +121
if err := vmanomaly.CreateOrUpdateConfig(ctx, r, item, &instance); err != nil {
l.Error(err, "failed to update vmanomaly config")
}
}
Copy link

Copilot AI Apr 3, 2026

Choose a reason for hiding this comment

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

Errors from vmanomaly.CreateOrUpdateConfig are only logged and then ignored, so the reconcile returns success even if updating VMAnomaly instances fails (no retry/requeue). Consider aggregating these errors (or returning the first error) so controller-runtime will requeue and the failure is visible.

Copilot uses AI. Check for mistakes.
Comment thread docs/resources/vmanomalyconfig.md Outdated
The `VMAnomalyConfig` CRD allows to declaratively define anomaly detection [models](https://docs.victoriametrics.com/anomaly-detection/components/models/). [schedulers](https://docs.victoriametrics.com/anomaly-detection/components/schedulers/) and [queries](https://docs.victoriametrics.com/anomaly-detection/components/reader/#per-query-parameters).

`VMAnomalyConfig` object updates `models`, `schedulers` and `reader.queries` sections of [VMAnomaly](https://docs.victoriametrics.com/anomaly-detection/)
configuration by adding items with `{metadata.namespace}-{metadata.name}` key prefix. Whole VMAnomalyConfig fails if at least one item collides:
Copy link

Copilot AI Apr 3, 2026

Choose a reason for hiding this comment

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

The doc claims "Whole VMAnomalyConfig fails if at least one item collides", but the current implementation uses ChildObjects.ForEachCollectSkipInvalid (skips invalid configs and continues generating the main config). Either adjust the implementation to fail hard on collisions, or update the documentation to reflect the skip-with-status behavior so users know what to expect.

Suggested change
configuration by adding items with `{metadata.namespace}-{metadata.name}` key prefix. Whole VMAnomalyConfig fails if at least one item collides:
configuration by adding items with `{metadata.namespace}-{metadata.name}` key prefix. If at least one generated item collides with an existing key, only the colliding item is skipped, while other valid items from the same `VMAnomalyConfig` are still added to the resulting configuration. Check the `VMAnomalyConfig` status and related events to identify skipped items caused by collisions.

Copilot uses AI. Check for mistakes.
Comment on lines +20 to +83
"context"

. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
k8serrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/reconcile"

vmv1 "github.com/VictoriaMetrics/operator/api/operator/v1"
)

var _ = Describe("VMAnomalyConfig Controller", func() {
Context("When reconciling a resource", func() {
const resourceName = "test-resource"

ctx := context.Background()

typeNamespacedName := types.NamespacedName{
Name: resourceName,
Namespace: "default", // TODO(user):Modify as needed
}
vmanomalyconfig := &vmv1.VMAnomalyConfig{}

BeforeEach(func() {
By("creating the custom resource for the Kind VMAnomalyConfig")
err := k8sClient.Get(ctx, typeNamespacedName, vmanomalyconfig)
if err != nil && k8serrors.IsNotFound(err) {
resource := &vmv1.VMAnomalyConfig{
ObjectMeta: metav1.ObjectMeta{
Name: resourceName,
Namespace: "default",
},
// TODO(user): Specify other spec details if needed.
}
Expect(k8sClient.Create(ctx, resource)).To(Succeed())
}
})

AfterEach(func() {
// TODO(user): Cleanup logic after each test, like removing the resource instance.
resource := &vmv1.VMAnomalyConfig{}
err := k8sClient.Get(ctx, typeNamespacedName, resource)
Expect(err).NotTo(HaveOccurred())

By("Cleanup the specific resource instance VMAnomalyConfig")
Expect(k8sClient.Delete(ctx, resource)).To(Succeed())
})
It("should successfully reconcile the resource", func() {
By("Reconciling the created resource")
controllerReconciler := &VMAnomalyConfigReconciler{
Client: k8sClient,
OriginScheme: k8sClient.Scheme(),
}

_, err := controllerReconciler.Reconcile(ctx, reconcile.Request{
NamespacedName: typeNamespacedName,
})
Expect(err).NotTo(HaveOccurred())
// TODO(user): Add more specific assertions depending on your controller's reconciliation logic.
// Example: If you expect a certain status condition after reconciliation, verify it here.
})
})
})
Copy link

Copilot AI Apr 3, 2026

Choose a reason for hiding this comment

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

This new controller test is kubebuilder scaffold with TODOs and no assertions about reconciliation side-effects, so it doesn't meaningfully cover the new behavior. Either implement real assertions (e.g., create VMAnomaly + VMAnomalyConfig and verify the generated Secret/status updates), or remove the scaffold test to avoid giving a false sense of coverage.

Suggested change
"context"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
k8serrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/reconcile"
vmv1 "github.com/VictoriaMetrics/operator/api/operator/v1"
)
var _ = Describe("VMAnomalyConfig Controller", func() {
Context("When reconciling a resource", func() {
const resourceName = "test-resource"
ctx := context.Background()
typeNamespacedName := types.NamespacedName{
Name: resourceName,
Namespace: "default", // TODO(user):Modify as needed
}
vmanomalyconfig := &vmv1.VMAnomalyConfig{}
BeforeEach(func() {
By("creating the custom resource for the Kind VMAnomalyConfig")
err := k8sClient.Get(ctx, typeNamespacedName, vmanomalyconfig)
if err != nil && k8serrors.IsNotFound(err) {
resource := &vmv1.VMAnomalyConfig{
ObjectMeta: metav1.ObjectMeta{
Name: resourceName,
Namespace: "default",
},
// TODO(user): Specify other spec details if needed.
}
Expect(k8sClient.Create(ctx, resource)).To(Succeed())
}
})
AfterEach(func() {
// TODO(user): Cleanup logic after each test, like removing the resource instance.
resource := &vmv1.VMAnomalyConfig{}
err := k8sClient.Get(ctx, typeNamespacedName, resource)
Expect(err).NotTo(HaveOccurred())
By("Cleanup the specific resource instance VMAnomalyConfig")
Expect(k8sClient.Delete(ctx, resource)).To(Succeed())
})
It("should successfully reconcile the resource", func() {
By("Reconciling the created resource")
controllerReconciler := &VMAnomalyConfigReconciler{
Client: k8sClient,
OriginScheme: k8sClient.Scheme(),
}
_, err := controllerReconciler.Reconcile(ctx, reconcile.Request{
NamespacedName: typeNamespacedName,
})
Expect(err).NotTo(HaveOccurred())
// TODO(user): Add more specific assertions depending on your controller's reconciliation logic.
// Example: If you expect a certain status condition after reconciliation, verify it here.
})
})
})
. "github.com/onsi/ginkgo/v2"
)
// The autogenerated kubebuilder scaffold test for VMAnomalyConfig was removed
// because it only asserted that Reconcile returned no error and did not verify
// any reconciliation side-effects. Add a controller test here once concrete
// assertions can be made against observable behavior.

Copilot uses AI. Check for mistakes.
Comment thread docs/resources/vmanomalyconfig.md Outdated
Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai Bot left a comment

Choose a reason for hiding this comment

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

1 issue found across 2 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="docs/CHANGELOG.md">

<violation number="1" location="docs/CHANGELOG.md:20">
P1: Custom agent: **Changelog Review Agent**

This new changelog item is non-compliant with the required changelog format: it is missing the mandatory `FEATURE|BUGFIX|SECURITY` prefix, affected services, and reference links.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review, or fix all with cubic.

Comment thread docs/CHANGELOG.md Outdated
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Do we want to run it through v1beta1 for a few releases first?

Comment thread docs/CHANGELOG.md Outdated
Comment on lines +39 to +40
for i := range list.Items {
item := &list.Items[i]
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Suggested change
for i := range list.Items {
item := &list.Items[i]
for _, item := range list.Items {

Since we're not mutating item here

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.

we're mutating them later in ForEach loops

case cr.Spec.ConfigRawYaml != "":
data = []byte(cr.Spec.ConfigRawYaml)
default:
return nil, fmt.Errorf(`either "configRawYaml" or "configSecret" are required`)
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

We should do this check via validatingwebhook. Also, I'd expect raw yaml to take precedence when both are specified?

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.

vmalertmanager has the same properties and priorities are the same

Comment thread internal/controller/operator/factory/vmanomaly/pod.go Outdated
)

func reloadSupported(cr *vmv1.VMAnomaly) bool {
anomalyVersion, err := semver.NewVersion(cr.Spec.Image.Tag)
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This might break if customers use custom tags / RCs - we should add a CHANGELOG entry for this

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.

rcs should be covered by this check, but custom builds - not, haven't seen Fred shares builds with nonstandard versions

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Okay, lets mention it in the changelog - there is a chance the customers may mirror the images in their org and having this mentioned may save us some time on issue troubleshooting

}

if err := vmanomaly.CreateOrUpdateConfig(ctx, r, item, &instance); err != nil {
l.Error(err, "failed to update vmanomaly config")
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Suggested change
l.Error(err, "failed to update vmanomaly config")
l.Error(err, "failed to update vmanomaly config")
return

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.

problem with this change is that error can be caused by other vmanomalyconfig

Name: resourceName,
Namespace: "default",
},
// TODO(user): Specify other spec details if needed.
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

:)

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.

this is autogenerated file

NamespacedName: typeNamespacedName,
})
Expect(err).NotTo(HaveOccurred())
// TODO(user): Add more specific assertions depending on your controller's reconciliation logic.
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

We can extend the e2e tests later

Comment thread test/e2e/upgrade/upgrade_test.go Outdated
AndrewChubatiuk and others added 2 commits April 17, 2026 11:50
Co-authored-by: Vadim Rutkovsky <vadim@vrutkovs.eu>
Signed-off-by: Andrii Chubatiuk <andrew.chubatiuk@gmail.com>
Co-authored-by: Vadim Rutkovsky <vadim@vrutkovs.eu>
Signed-off-by: Andrii Chubatiuk <andrew.chubatiuk@gmail.com>
Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai Bot left a comment

Choose a reason for hiding this comment

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

1 issue found across 2 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="docs/CHANGELOG.md">

<violation number="1" location="docs/CHANGELOG.md:22">
P3: Use a plural verb in this release note sentence ("were introduced" instead of "was introduced").</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review, or fix all with cubic.

Comment thread docs/CHANGELOG.md Outdated
Co-authored-by: Vadim Rutkovsky <vadim@vrutkovs.eu>
Signed-off-by: Andrii Chubatiuk <andrew.chubatiuk@gmail.com>
Signed-off-by: Vadim Rutkovsky <vadim@vrutkovs.eu>
Comment thread docs/resources/vmanomaly.md Outdated
Co-authored-by: Vadim Rutkovsky <vadim@vrutkovs.eu>
Signed-off-by: Andrii Chubatiuk <andrew.chubatiuk@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants