Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore(deps): update kargo docker tag to v1.1.1 #901

Merged
merged 1 commit into from
Dec 23, 2024

Conversation

renovate[bot]
Copy link
Contributor

@renovate renovate bot commented Dec 6, 2024

This PR contains the following updates:

Package Update Change
kargo minor 1.0.3 -> 1.1.1

Release Notes

akuity/kargo (kargo)

v1.1.1

Compare Source

What's Changed

Full Changelog: akuity/kargo@v1.1.0...v1.1.1

v1.1.0

Compare Source

💪 The Kargo team, with support from community contributors, is proud to present v1.1.0 -- Kargo's first minor but mighty release since going GA.

🆕 What's New?

${{ Expression Language Support }}

The community reception to Kargo's transition away from its rigid, legacy promotion mechanisms, toward more flexible promotion steps has been overwhelmingly positive. When promotion steps first appeared in v0.9.0, we knew immediately that support for an expression language would be a powerful complement to that new feature, and this release delivers on that.

For more details, consult our expression reference documentation. Examples in our promotion steps reference documentation have also been extensively updated to reflect realistic usage of the expression language.

With the advent of expression language support in promotion steps, we're noticing our own promotions processes becoming more and more similar from Stage to Stage -- often varying only in the definition of a few key variables. With this observation, it's clear that the time is right to promote (pun fully intended) promotion processes to a first-class construct. So, to tease the upcoming v1.2.0 release, expect to see a new PromotionTemplate CRD that will enable users to DRY up their pipelines!

🪜 New and Updated Promotion Steps

‼️ This section contains important details about deprecations. ‼️

When promotion steps were initially introduced without expression language support, many promotion steps included fields explicitly designed to reference the output of previous steps. For example, the git-wait-for-pr step has a prNumberFromStep field whose value should be set to the alias of a previous git-open-pr step. With expressions, these sort of highly-specialized fields become unnecessary and have been deprecated and scheduled for removal in v1.3.0. In their place, are new fields that, combined with expressions, offer improved flexibility. The aforementioned git-wait-for-pr step, for example, now has a prNumber field whose value might be set using an expression such as ${{ outputs['open-pr'].prNumber }}.

Two new promotion steps have been added in this release:

  • yaml-update, with the help of expressions, presents a more generic and flexible alternative to the helm-update-image step, which is also now deprecated and scheduled for removal in v1.3.0.

  • http provides a flexible means of interacting with HTTP/S endpoints. This opens up the possibility of simple, low-level integration with external systems that support webhooks or expose RESTful APIs. It is easy, for instance, to use the http step to post a message to a Slack channel as part of a promotion process.

    While we plan for more complex integrations with external systems to be phased in over a series of releases in the form of support for third-party or site-specific promotion steps, we believe that in the interim, the http step will provide a powerful and flexible means of integrating with a wide variety of systems.

Two steps have been updated:

  • argo-cd-update has undergone some behavioral changes. Until now, the step, which registers health checks to be performed in the course of Stage reconciliation, has automatically attempted to infer a specific desired revision (e.g. a Git commit SHA) to which the Application being updated should be observably synced to in order for the Stage to be considered healthy. This behavior has been the foundation of some difficulty for users who have multiple Applications tracking the head of a single branch and who update that branch from multiple Stages. Under such circumstances, it becomes impossible for all such Stages to be healthy simultaneously.

    To correct for this, the argo-cd-update step now makes no attempt to automatically infer the desired revision and will only factor the revision to which an Application is synced into a health check when the desired revision has been explicitly specified in the step's configuration. This change in behavior is technically a breaking change, but as it relaxes a constraint rather than imposing a new one, we do not anticipate any significant impact to existing uses of the step.

  • git-open-pr has been prone to errors when a PR identical to the one it attempts to create already exists. There were a variety of complex conditions that may have precipitated such a scenario. The step (and parts of the step execution engine) have been refactored to make the step more resilient to this possibility. When a PR identical to the one the step intends to create already exists, the step will now simply "adopt" that PR and proceed as if successful.

Last, but not least, all steps can now be configured with an optional timeout and error threshold. An error threshold greater than the default of one specifies the number of consecutive failed attempts to execute the step must occur before the entire Promotion is failed.

Please refer to the promotion steps reference documentation for detailed information about new and updated promotion steps as well as deprecated steps and fields.

⚙️ Resource and Concurrency Settings

This release introduces a number of optimizations to Kargo's resource utilization.

  • GOMAXPROCS is now set on all Kargo components to equal the CPU cores available, rounded up to the nearest integer. This prevents Go from backing goroutines with a number of OS threads exceeding the number of cores available, which is a condition that can result in losing compute time to avoidable context switches.

  • GOMEMLIMIT (soft memory limit) is now set on all Kargo components to equal the container's memory limit. This helps Go to optimize garbage collection.

  • MaxConcurrentReconciles now defaults to four (instead of one) for all reconcilers in both the controller and management controller. These defaults are overridable on a per-controller or per-reconciler basis via chart configuration at install-time.

To assist in troubleshooting, effective values for all of the above are logged by each component at startup.

🛠️ Refactored Stage Reconciliation

The controller's Stage reconciliation logic has been overhauled from top to bottom. The new implementation is more robust, more efficient, and should prove easier to maintain over time. We anticipate the refactored reconciler to also reduce the incidence of inconvenient behaviors such as pending Promotions being "stuck" for long periods of time while waiting for a Stage to reach or return to a healthy state that it may never reach.

For the most part, these changes are purely internal, but users may notice that the reconciler now surfaces much more detailed information about the state of a Stage in its status subresource in the form of conditions. These should paint a clearer picture of what's happening with a Stage at any given time.

🖥️ UI Improvements

As always, the Kargo UI has received too many improvements to list in this release. Here are a few highlights:

  • New Warehouses can now be interactively configured using a new UI wizard.

  • The UI's homepage, which lists all Kargo Projects, now remembers what page of the paginated list the user was last viewing. This means that users returning to the homepage after navigating to a Project will be returned to the same page of the list they were viewing before.

  • Within the view of a single Project, it is now possible to zoom in/out on the pipeline graph and drag to reposition it. This should make it considerably easier to work with long pipelines or Projects containing many pipelines.

  • A new user information page accessible from the sidebar displays the currently logged-in user's claims obtained from the identity token issued by the configured' OIDC identity provider. We anticipate this page will be useful for debugging OIDC configuration issues as well as authorization issues.

🙏 New Contributors

Thank you to the following community members whose first contributions to Kargo were included in this release:

Full Changelog: akuity/kargo@v1.0.4...v1.1.0

v1.0.4

Compare Source

What's Changed

Full Changelog: akuity/kargo@v1.0.3...v1.0.4


Configuration

📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

Copy link
Contributor

github-actions bot commented Dec 6, 2024

Changes Rendered Chart
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/cluster-role-binding.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/cluster-role-binding.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/cluster-role-binding.yaml	2024-12-06 19:13:47.108887137 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/cluster-role-binding.yaml	2024-12-06 19:13:12.716887854 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-api
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -25,12 +25,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-api-rollouts
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/cluster-role.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/cluster-role.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/cluster-role.yaml	2024-12-06 19:13:47.108887137 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/cluster-role.yaml	2024-12-06 19:13:12.716887854 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-api
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 rules:
   - apiGroups:
@@ -129,12 +129,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-project-admin
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 rules:
 - apiGroups:
@@ -158,12 +158,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-api-rollouts
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/configmap.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/configmap.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/configmap.yaml	2024-12-06 19:13:47.108887137 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/configmap.yaml	2024-12-06 19:13:12.716887854 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 data:
   KARGO_NAMESPACE: default
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/deployment.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/deployment.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/deployment.yaml	2024-12-06 19:13:47.112887136 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/deployment.yaml	2024-12-06 19:13:12.716887854 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 spec:
   replicas: 1
@@ -23,12 +23,12 @@
       app.kubernetes.io/component: api
   template:
     metadata:
       labels:
-        helm.sh/chart: kargo-1.0.3
+        helm.sh/chart: kargo-1.1.0
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
-        app.kubernetes.io/version: "v1.0.3"
+        app.kubernetes.io/version: "v1.1.0"
         app.kubernetes.io/managed-by: Helm
         app.kubernetes.io/component: api
       annotations:
         configmap/checksum: 23e23fcd98e89d6de26a59efb1ce09ebc45ed7438e0dad6c06ce251f738e491b
@@ -36,11 +36,22 @@
     spec:
       serviceAccount: kargo-api
       containers:
         - name: api
-          image: ghcr.io/akuity/kargo:v1.0.3
+          image: ghcr.io/akuity/kargo:v1.1.0
           imagePullPolicy: IfNotPresent
           command: ["/usr/local/bin/kargo", "api"]
+          env:
+          - name: GOMEMLIMIT
+            valueFrom:
+              resourceFieldRef:
+                containerName: api
+                resource: limits.memory
+          - name: GOMAXPROCS
+            valueFrom:
+              resourceFieldRef:
+                containerName: api
+                resource: limits.cpu
           envFrom:
           - configMapRef:
               name: kargo-api
           - secretRef:
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/ingress.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/ingress.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/ingress.yaml	2024-12-06 19:13:47.112887136 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/ingress.yaml	2024-12-06 19:13:12.720887853 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
   annotations:
     cert-manager.io/cluster-issuer: "letsencrypt-prod"
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/secret.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/secret.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/secret.yaml	2024-12-06 19:13:47.108887137 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/secret.yaml	2024-12-06 19:13:12.716887854 +0000
@@ -6,12 +6,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 stringData:  
   ADMIN_ACCOUNT_PASSWORD_HASH: "$2y$10$7FtRo..bKM5qcrp8dv.7f.TDAQLRSge47Dpi8sLM4sWbWqd9kQAha"  
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/service-account.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/service-account.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/service-account.yaml	2024-12-06 19:13:47.108887137 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/service-account.yaml	2024-12-06 19:13:12.716887854 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/service.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/service.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/service.yaml	2024-12-06 19:13:47.112887136 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/service.yaml	2024-12-06 19:13:12.716887854 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 spec:
   type: ClusterIP
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/cluster-role-bindings.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/cluster-role-bindings.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/cluster-role-bindings.yaml	2024-12-06 19:13:47.108887137 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/cluster-role-bindings.yaml	2024-12-06 19:13:12.716887854 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -25,12 +25,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-controller-argocd
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -46,12 +46,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-controller-rollouts
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/cluster-roles.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/cluster-roles.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/cluster-roles.yaml	2024-12-06 19:13:47.108887137 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/cluster-roles.yaml	2024-12-06 19:13:12.716887854 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 rules:
 - apiGroups:
@@ -71,12 +71,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-controller-read-secrets
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 rules:
 - apiGroups:
@@ -93,12 +93,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-controller-argocd
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 rules:
 - apiGroups:
@@ -116,12 +116,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-controller-rollouts
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/configmap.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/configmap.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/configmap.yaml	2024-12-06 19:13:47.108887137 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/configmap.yaml	2024-12-06 19:13:12.716887854 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 data:
   API_SERVER_BASE_URL: https://kargo.demo.kubrix.cloud
@@ -23,4 +23,8 @@
   ARGOCD_NAMESPACE: argocd
   ARGOCD_WATCH_ARGOCD_NAMESPACE_ONLY: "false"
   ROLLOUTS_INTEGRATION_ENABLED: "true"
   ROLLOUTS_CONTROLLER_INSTANCE_ID: ""
+  MAX_CONCURRENT_CONTROL_FLOW_RECONCILES: "4"
+  MAX_CONCURRENT_PROMOTION_RECONCILES: "4"
+  MAX_CONCURRENT_STAGE_RECONCILES: "4"
+  MAX_CONCURRENT_WAREHOUSE_RECONCILES: "4"
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service-account.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service-account.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service-account.yaml	2024-12-06 19:13:47.020887165 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service-account.yaml	2024-12-06 19:13:12.624887885 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-webhooks-server
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service.yaml	2024-12-06 19:13:47.020887165 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service.yaml	2024-12-06 19:13:12.628887883 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-webhooks-server
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 spec:
   type: ClusterIP
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/cluster-role-binding.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/cluster-role-binding.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/cluster-role-binding.yaml	2024-12-06 19:13:47.292887078 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/cluster-role-binding.yaml	2024-12-06 19:13:12.896887793 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-api
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -25,12 +25,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-api-rollouts
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/cluster-role.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/cluster-role.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/cluster-role.yaml	2024-12-06 19:13:47.292887078 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/cluster-role.yaml	2024-12-06 19:13:12.896887793 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-api
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 rules:
   - apiGroups:
@@ -129,12 +129,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-project-admin
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 rules:
 - apiGroups:
@@ -158,12 +158,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-api-rollouts
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/configmap.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/configmap.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/configmap.yaml	2024-12-06 19:13:47.288887080 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/configmap.yaml	2024-12-06 19:13:12.892887794 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 data:
   KARGO_NAMESPACE: default
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/deployment.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/deployment.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/deployment.yaml	2024-12-06 19:13:47.292887078 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/deployment.yaml	2024-12-06 19:13:12.896887793 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 spec:
   replicas: 1
@@ -23,12 +23,12 @@
       app.kubernetes.io/component: api
   template:
     metadata:
       labels:
-        helm.sh/chart: kargo-1.0.3
+        helm.sh/chart: kargo-1.1.0
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
-        app.kubernetes.io/version: "v1.0.3"
+        app.kubernetes.io/version: "v1.1.0"
         app.kubernetes.io/managed-by: Helm
         app.kubernetes.io/component: api
       annotations:
         configmap/checksum: f7f293f570771137759b3d7ce47742b5fa1dcba3b093cad64ec2ba65b8dc7c10
@@ -36,11 +36,22 @@
     spec:
       serviceAccount: kargo-api
       containers:
         - name: api
-          image: ghcr.io/akuity/kargo:v1.0.3
+          image: ghcr.io/akuity/kargo:v1.1.0
           imagePullPolicy: IfNotPresent
           command: ["/usr/local/bin/kargo", "api"]
+          env:
+          - name: GOMEMLIMIT
+            valueFrom:
+              resourceFieldRef:
+                containerName: api
+                resource: limits.memory
+          - name: GOMAXPROCS
+            valueFrom:
+              resourceFieldRef:
+                containerName: api
+                resource: limits.cpu
           envFrom:
           - configMapRef:
               name: kargo-api
           - secretRef:
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/ingress.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/ingress.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/ingress.yaml	2024-12-06 19:13:47.292887078 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/ingress.yaml	2024-12-06 19:13:12.896887793 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
   annotations:
     cert.gardener.cloud/purpose: "managed"
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/secret.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/secret.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/secret.yaml	2024-12-06 19:13:47.288887080 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/secret.yaml	2024-12-06 19:13:12.892887794 +0000
@@ -6,12 +6,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 stringData:  
   ADMIN_ACCOUNT_PASSWORD_HASH: "$2y$10$7FtRo..bKM5qcrp8dv.7f.TDAQLRSge47Dpi8sLM4sWbWqd9kQAha"  
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/service-account.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/service-account.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/service-account.yaml	2024-12-06 19:13:47.288887080 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/service-account.yaml	2024-12-06 19:13:12.892887794 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/service.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/service.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/service.yaml	2024-12-06 19:13:47.292887078 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/service.yaml	2024-12-06 19:13:12.896887793 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 spec:
   type: ClusterIP
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/deployment.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/deployment.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/deployment.yaml	2024-12-06 19:13:47.112887136 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/deployment.yaml	2024-12-06 19:13:12.716887854 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 spec:
   replicas: 1
@@ -23,23 +23,35 @@
       app.kubernetes.io/component: controller
   template:
     metadata:
       labels:
-        helm.sh/chart: kargo-1.0.3
+        helm.sh/chart: kargo-1.1.0
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
-        app.kubernetes.io/version: "v1.0.3"
+        app.kubernetes.io/version: "v1.1.0"
         app.kubernetes.io/managed-by: Helm
         app.kubernetes.io/component: controller
       annotations:
-        configmap/checksum: 7cabaa854d19185c6409f4332a705d629e064ad33fc0783b3812dd9cd9ad408c
+        configmap/checksum: c53d7b29f1a07bc575b317d28911d4a1f3a3eeee02873a734065b499a35447da
     spec:
       serviceAccount: kargo-controller
       containers:
       - name: controller
-        image: ghcr.io/akuity/kargo:v1.0.3
+        image: ghcr.io/akuity/kargo:v1.1.0
         imagePullPolicy: IfNotPresent
-        command: ["/usr/local/bin/kargo", "controller"]
+        command: ["/sbin/tini", "--", "/usr/local/bin/kargo"]
+        args: ["controller"]
+        env:
+        - name: GOMEMLIMIT
+          valueFrom:
+            resourceFieldRef:
+              containerName: controller
+              resource: limits.memory
+        - name: GOMAXPROCS
+          valueFrom:
+            resourceFieldRef:
+              containerName: controller
+              resource: limits.cpu
         envFrom:
         - configMapRef:
             name: kargo-controller
         resources:
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/cluster-role-bindings.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/cluster-role-bindings.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/cluster-role-bindings.yaml	2024-12-06 19:13:47.292887078 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/cluster-role-bindings.yaml	2024-12-06 19:13:12.896887793 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -25,12 +25,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-controller-argocd
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -46,12 +46,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-controller-rollouts
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/cluster-roles.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/cluster-roles.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/cluster-roles.yaml	2024-12-06 19:13:47.292887078 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/cluster-roles.yaml	2024-12-06 19:13:12.896887793 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 rules:
 - apiGroups:
@@ -71,12 +71,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-controller-read-secrets
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 rules:
 - apiGroups:
@@ -93,12 +93,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-controller-argocd
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 rules:
 - apiGroups:
@@ -116,12 +116,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-controller-rollouts
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/configmap.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/configmap.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/configmap.yaml	2024-12-06 19:13:47.288887080 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/configmap.yaml	2024-12-06 19:13:12.892887794 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 data:
   API_SERVER_BASE_URL: https://kargo.lab.suxessit.k8s.cloud.uibk.ac.at
@@ -23,4 +23,8 @@
   ARGOCD_NAMESPACE: argocd
   ARGOCD_WATCH_ARGOCD_NAMESPACE_ONLY: "false"
   ROLLOUTS_INTEGRATION_ENABLED: "true"
   ROLLOUTS_CONTROLLER_INSTANCE_ID: ""
+  MAX_CONCURRENT_CONTROL_FLOW_RECONCILES: "4"
+  MAX_CONCURRENT_PROMOTION_RECONCILES: "4"
+  MAX_CONCURRENT_STAGE_RECONCILES: "4"
+  MAX_CONCURRENT_WAREHOUSE_RECONCILES: "4"
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/deployment.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/deployment.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/deployment.yaml	2024-12-06 19:13:47.292887078 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/deployment.yaml	2024-12-06 19:13:12.896887793 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 spec:
   replicas: 1
@@ -23,23 +23,35 @@
       app.kubernetes.io/component: controller
   template:
     metadata:
       labels:
-        helm.sh/chart: kargo-1.0.3
+        helm.sh/chart: kargo-1.1.0
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
-        app.kubernetes.io/version: "v1.0.3"
+        app.kubernetes.io/version: "v1.1.0"
         app.kubernetes.io/managed-by: Helm
         app.kubernetes.io/component: controller
       annotations:
-        configmap/checksum: ddbd5dade03851eb43bd61b1787dbced669b5565d35a410fbaedb83336a3aff6
+        configmap/checksum: bcb880b49320b1182a8b9bae2ffe173ddeb1765410da0e833106254d6c55957d
     spec:
       serviceAccount: kargo-controller
       containers:
       - name: controller
-        image: ghcr.io/akuity/kargo:v1.0.3
+        image: ghcr.io/akuity/kargo:v1.1.0
         imagePullPolicy: IfNotPresent
-        command: ["/usr/local/bin/kargo", "controller"]
+        command: ["/sbin/tini", "--", "/usr/local/bin/kargo"]
+        args: ["controller"]
+        env:
+        - name: GOMEMLIMIT
+          valueFrom:
+            resourceFieldRef:
+              containerName: controller
+              resource: limits.memory
+        - name: GOMAXPROCS
+          valueFrom:
+            resourceFieldRef:
+              containerName: controller
+              resource: limits.cpu
         envFrom:
         - configMapRef:
             name: kargo-controller
         resources:
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/service-account.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/service-account.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/service-account.yaml	2024-12-06 19:13:47.288887080 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/service-account.yaml	2024-12-06 19:13:12.892887794 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/crds.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/crds.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/crds.yaml	2024-12-06 19:13:47.292887078 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/crds.yaml	2024-12-06 19:13:12.896887793 +0000
@@ -3,9 +3,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: freights.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -205,9 +205,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: projects.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -373,9 +373,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: promotions.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -460,10 +460,58 @@
                     as:
                       description: As is the alias this step can be referred to as.
                       type: string
                     config:
-                      description: Config is the configuration for the directive.
+                      description: |-
+                        Config is opaque configuration for the PromotionStep that is understood
+                        only by each PromotionStep's implementation. It is legal to utilize
+                        expressions in defining values at any level of this block.
+                        See https://docs.kargo.io/references/expression-language for details.
                       x-kubernetes-preserve-unknown-fields: true
+                    retry:
+                      description: Retry is the retry policy for this step.
+                      properties:
+                        errorThreshold:
+                          description: |-
+                            ErrorThreshold is the number of consecutive times the step must fail (for
+                            any reason) before retries are abandoned and the entire Promotion is marked
+                            as failed.
+
+                            If this field is set to 0, the effective default will be a step-specific
+                            one. If no step-specific default exists (i.e. is also 0), the effective
+                            default will be the system-wide default of 1.
+
+                            A value of 1 will cause the Promotion to be marked as failed after just
+                            a single failure; i.e. no retries will be attempted.
+
+                            There is no option to specify an infinite number of retries using a value
+                            such as -1.
+
+                            In a future release, Kargo is likely to become capable of distinguishing
+                            between recoverable and non-recoverable step failures. At that time, it is
+                            planned that unrecoverable failures will not be subject to this threshold
+                            and will immediately cause the Promotion to be marked as failed without
+                            further condition.
+                          format: int32
+                          type: integer
+                        timeout:
+                          description: |-
+                            Timeout is the soft maximum interval in which a step that returns a Running
+                            status (which typically indicates it's waiting for something to happen)
+                            may be retried.
+
+                            The maximum is a soft one because the check for whether the interval has
+                            elapsed occurs AFTER the step has run. This effectively means a step may
+                            run ONCE beyond the close of the interval.
+
+                            If this field is set to nil, the effective default will be a step-specific
+                            one. If no step-specific default exists (i.e. is also nil), the effective
+                            default will be the system-wide default of 0.
+
+                            A value of 0 will cause the step to be retried indefinitely unless the
+                            ErrorThreshold is reached.
+                          type: string
+                      type: object
                     uses:
                       description: Uses identifies a runner that can execute this
                         step.
                       minLength: 1
@@ -471,8 +519,33 @@
                   required:
                   - uses
                   type: object
                 type: array
+              vars:
+                description: |-
+                  Vars is a list of variables that can be referenced by expressions in
+                  promotion steps.
+                items:
+                  description: |-
+                    PromotionVariable describes a single variable that may be referenced by
+                    expressions in promotion steps.
+                  properties:
+                    name:
+                      description: Name is the name of the variable.
+                      minLength: 1
+                      pattern: ^[a-zA-Z_]\w*$
+                      type: string
+                    value:
+                      description: |-
+                        Value is the value of the variable. It is allowed to utilize expressions
+                        in the value.
+                        See https://docs.kargo.io/references/expression-language for details.
+                      type: string
+                  required:
+                  - name
+                  - value
+                  type: object
+                type: array
             required:
             - freight
             - stage
             type: object
@@ -857,8 +930,46 @@
                 description: |-
                   State stores the state of the promotion process between reconciliation
                   attempts.
                 x-kubernetes-preserve-unknown-fields: true
+              stepExecutionMetadata:
+                description: |-
+                  StepExecutionMetadata tracks metadata pertaining to the execution
+                  of individual promotion steps.
+                items:
+                  description: |-
+                    StepExecutionMetadata tracks metadata pertaining to the execution of
+                    a promotion step.
+                  properties:
+                    alias:
+                      description: Alias is the alias of the step.
+                      type: string
+                    errorCount:
+                      description: ErrorCount tracks consecutive failed attempts to
+                        execute the step.
+                      format: int32
+                      type: integer
+                    finishedAt:
+                      description: |-
+                        FinishedAt is the time at which the final attempt to execute the step
+                        completed.
+                      format: date-time
+                      type: string
+                    message:
+                      description: Message is a display message about the step, including
+                        any errors.
+                      type: string
+                    startedAt:
+                      description: |-
+                        StartedAt is the time at which the first attempt to execute the step
+                        began.
+                      format: date-time
+                      type: string
+                    status:
+                      description: Status is the high-level outcome of the step.
+                      type: string
+                  type: object
+                type: array
             type: object
         required:
         - spec
         type: object
@@ -871,9 +982,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: stages.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -951,10 +1062,58 @@
                               description: As is the alias this step can be referred
                                 to as.
                               type: string
                             config:
-                              description: Config is the configuration for the directive.
+                              description: |-
+                                Config is opaque configuration for the PromotionStep that is understood
+                                only by each PromotionStep's implementation. It is legal to utilize
+                                expressions in defining values at any level of this block.
+                                See https://docs.kargo.io/references/expression-language for details.
                               x-kubernetes-preserve-unknown-fields: true
+                            retry:
+                              description: Retry is the retry policy for this step.
+                              properties:
+                                errorThreshold:
+                                  description: |-
+                                    ErrorThreshold is the number of consecutive times the step must fail (for
+                                    any reason) before retries are abandoned and the entire Promotion is marked
+                                    as failed.
+
+                                    If this field is set to 0, the effective default will be a step-specific
+                                    one. If no step-specific default exists (i.e. is also 0), the effective
+                                    default will be the system-wide default of 1.
+
+                                    A value of 1 will cause the Promotion to be marked as failed after just
+                                    a single failure; i.e. no retries will be attempted.
+
+                                    There is no option to specify an infinite number of retries using a value
+                                    such as -1.
+
+                                    In a future release, Kargo is likely to become capable of distinguishing
+                                    between recoverable and non-recoverable step failures. At that time, it is
+                                    planned that unrecoverable failures will not be subject to this threshold
+                                    and will immediately cause the Promotion to be marked as failed without
+                                    further condition.
+                                  format: int32
+                                  type: integer
+                                timeout:
+                                  description: |-
+                                    Timeout is the soft maximum interval in which a step that returns a Running
+                                    status (which typically indicates it's waiting for something to happen)
+                                    may be retried.
+
+                                    The maximum is a soft one because the check for whether the interval has
+                                    elapsed occurs AFTER the step has run. This effectively means a step may
+                                    run ONCE beyond the close of the interval.
+
+                                    If this field is set to nil, the effective default will be a step-specific
+                                    one. If no step-specific default exists (i.e. is also nil), the effective
+                                    default will be the system-wide default of 0.
+
+                                    A value of 0 will cause the step to be retried indefinitely unless the
+                                    ErrorThreshold is reached.
+                                  type: string
+                              type: object
                             uses:
                               description: Uses identifies a runner that can execute
                                 this step.
                               minLength: 1
@@ -963,8 +1122,33 @@
                           - uses
                           type: object
                         minItems: 1
                         type: array
+                      vars:
+                        description: |-
+                          Vars is a list of variables that can be referenced by expressions in
+                          promotion steps.
+                        items:
+                          description: |-
+                            PromotionVariable describes a single variable that may be referenced by
+                            expressions in promotion steps.
+                          properties:
+                            name:
+                              description: Name is the name of the variable.
+                              minLength: 1
+                              pattern: ^[a-zA-Z_]\w*$
+                              type: string
+                            value:
+                              description: |-
+                                Value is the value of the variable. It is allowed to utilize expressions
+                                in the value.
+                                See https://docs.kargo.io/references/expression-language for details.
+                              type: string
+                          required:
+                          - name
+                          - value
+                          type: object
+                        type: array
                     type: object
                 required:
                 - spec
                 type: object
@@ -1104,8 +1288,70 @@
           status:
             description: Status describes the Stage's current and recent Freight,
               health, and more.
             properties:
+              conditions:
+                description: |-
+                  Conditions contains the last observations of the Stage's current
+                  state.
+                items:
+                  description: Condition contains details for one aspect of the current
+                    state of this API Resource.
+                  properties:
+                    lastTransitionTime:
+                      description: |-
+                        lastTransitionTime is the last time the condition transitioned from one status to another.
+                        This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.
+                      format: date-time
+                      type: string
+                    message:
+                      description: |-
+                        message is a human readable message indicating details about the transition.
+                        This may be an empty string.
+                      maxLength: 32768
+                      type: string
+                    observedGeneration:
+                      description: |-
+                        observedGeneration represents the .metadata.generation that the condition was set based upon.
+                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date
+                        with respect to the current state of the instance.
+                      format: int64
+                      minimum: 0
+                      type: integer
+                    reason:
+                      description: |-
+                        reason contains a programmatic identifier indicating the reason for the condition's last transition.
+                        Producers of specific condition types may define expected values and meanings for this field,
+                        and whether the values are considered a guaranteed API.
+                        The value should be a CamelCase string.
+                        This field may not be empty.
+                      maxLength: 1024
+                      minLength: 1
+                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
+                      type: string
+                    status:
+                      description: status of the condition, one of True, False, Unknown.
+                      enum:
+                      - "True"
+                      - "False"
+                      - Unknown
+                      type: string
+                    type:
+                      description: type of condition in CamelCase or in foo.example.com/CamelCase.
+                      maxLength: 316
+                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
+                      type: string
+                  required:
+                  - lastTransitionTime
+                  - message
+                  - reason
+                  - status
+                  - type
+                  type: object
+                type: array
+                x-kubernetes-list-map-keys:
+                - type
+                x-kubernetes-list-type: map
               currentPromotion:
                 description: CurrentPromotion is a reference to the currently Running
                   promotion.
                 properties:
@@ -1625,8 +1871,47 @@
                         description: |-
                           State stores the state of the promotion process between reconciliation
                           attempts.
                         x-kubernetes-preserve-unknown-fields: true
+                      stepExecutionMetadata:
+                        description: |-
+                          StepExecutionMetadata tracks metadata pertaining to the execution
+                          of individual promotion steps.
+                        items:
+                          description: |-
+                            StepExecutionMetadata tracks metadata pertaining to the execution of
+                            a promotion step.
+                          properties:
+                            alias:
+                              description: Alias is the alias of the step.
+                              type: string
+                            errorCount:
+                              description: ErrorCount tracks consecutive failed attempts
+                                to execute the step.
+                              format: int32
+                              type: integer
+                            finishedAt:
+                              description: |-
+                                FinishedAt is the time at which the final attempt to execute the step
+                                completed.
+                              format: date-time
+                              type: string
+                            message:
+                              description: Message is a display message about the
+                                step, including any errors.
+                              type: string
+                            startedAt:
+                              description: |-
+                                StartedAt is the time at which the first attempt to execute the step
+                                began.
+                              format: date-time
+                              type: string
+                            status:
+                              description: Status is the high-level outcome of the
+                                step.
+                              type: string
+                          type: object
+                        type: array
                     type: object
                 required:
                 - name
                 type: object
@@ -1857,51 +2142,8 @@
                 type: string
               health:
                 description: Health is the Stage's last observed health.
                 properties:
-                  argoCDApps:
-                    description: ArgoCDApps describes the current state of any related
-                      ArgoCD Applications.
-                    items:
-                      description: ArgoCDAppStatus describes the current state of
-                        a single ArgoCD Application.
-                      properties:
-                        healthStatus:
-                          description: HealthStatus is the health of the ArgoCD Application.
-                          properties:
-                            message:
-                              type: string
-                            status:
-                              type: string
-                          required:
-                          - status
-                          type: object
-                        name:
-                          description: Name is the name of the ArgoCD Application.
-                          type: string
-                        namespace:
-                          description: Namespace is the namespace of the ArgoCD Application.
-                          type: string
-                        syncStatus:
-                          description: SyncStatus is the sync status of the ArgoCD
-                            Application.
-                          properties:
-                            revision:
-                              type: string
-                            revisions:
-                              items:
-                                type: string
-                              type: array
-                            status:
-                              type: string
-                          required:
-                          - status
-                          type: object
-                      required:
-                      - name
-                      - namespace
-                      type: object
-                    type: array
                   config:
                     description: |-
                       Config is the opaque configuration of all health checks performed on this
                       Stage.
@@ -2446,8 +2688,47 @@
                         description: |-
                           State stores the state of the promotion process between reconciliation
                           attempts.
                         x-kubernetes-preserve-unknown-fields: true
+                      stepExecutionMetadata:
+                        description: |-
+                          StepExecutionMetadata tracks metadata pertaining to the execution
+                          of individual promotion steps.
+                        items:
+                          description: |-
+                            StepExecutionMetadata tracks metadata pertaining to the execution of
+                            a promotion step.
+                          properties:
+                            alias:
+                              description: Alias is the alias of the step.
+                              type: string
+                            errorCount:
+                              description: ErrorCount tracks consecutive failed attempts
+                                to execute the step.
+                              format: int32
+                              type: integer
+                            finishedAt:
+                              description: |-
+                                FinishedAt is the time at which the final attempt to execute the step
+                                completed.
+                              format: date-time
+                              type: string
+                            message:
+                              description: Message is a display message about the
+                                step, including any errors.
+                              type: string
+                            startedAt:
+                              description: |-
+                                StartedAt is the time at which the first attempt to execute the step
+                                began.
+                              format: date-time
+                              type: string
+                            status:
+                              description: Status is the high-level outcome of the
+                                step.
+                              type: string
+                          type: object
+                        type: array
                     type: object
                 required:
                 - name
                 type: object
@@ -2478,9 +2759,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: warehouses.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -2528,8 +2809,9 @@
                 description: |-
                   FreightCreationPolicy describes how Freight is created by this Warehouse.
                   This field is optional. When left unspecified, the field is implicitly
                   treated as if its value were "Automatic".
+                  Accepted values: Automatic, Manual
                 enum:
                 - Automatic
                 - Manual
                 type: string
@@ -2637,8 +2919,9 @@
                             CommitSelectionStrategy specifies the rules for how to identify the newest
                             commit of interest in the repository specified by the RepoURL field. This
                             field is optional. When left unspecified, the field is implicitly treated
                             as if its value were "NewestFromBranch".
+                            Accepted values: Lexical, NewestFromBranch, NewestTag, SemVer
                           enum:
                           - Lexical
                           - NewestFromBranch
                           - NewestTag
@@ -2782,8 +3065,9 @@
                             ImageSelectionStrategy specifies the rules for how to identify the newest version
                             of the image specified by the RepoURL field. This field is optional. When
                             left unspecified, the field is implicitly treated as if its value were
                             "SemVer".
+                            Accepted values: Digest, Lexical, NewestBuild, SemVer
                           enum:
                           - Digest
                           - Lexical
                           - NewestBuild
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-role-bindings.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-role-bindings.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-role-bindings.yaml	2024-12-06 19:13:47.292887078 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-role-bindings.yaml	2024-12-06 19:13:12.896887793 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-garbage-collector
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-roles.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-roles.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-roles.yaml	2024-12-06 19:13:47.292887078 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-roles.yaml	2024-12-06 19:13:12.896887793 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-garbage-collector
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/configmap.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/configmap.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/configmap.yaml	2024-12-06 19:13:47.288887080 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/configmap.yaml	2024-12-06 19:13:12.896887793 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-garbage-collector
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
 data:
   LOG_LEVEL: "INFO"
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cron-job.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cron-job.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cron-job.yaml	2024-12-06 19:13:47.292887078 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cron-job.yaml	2024-12-06 19:13:12.896887793 +0000
@@ -5,47 +5,59 @@
 metadata:
   name: kargo-garbage-collector
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
 spec:
   schedule: "0 * * * *"
   concurrencyPolicy: Forbid
   jobTemplate:
     metadata:
       labels:
-        helm.sh/chart: kargo-1.0.3
+        helm.sh/chart: kargo-1.1.0
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
-        app.kubernetes.io/version: "v1.0.3"
+        app.kubernetes.io/version: "v1.1.0"
         app.kubernetes.io/managed-by: Helm
         app.kubernetes.io/component: garbage-collector
       annotations:
         configmap/checksum: a825d50984da3ea04b6adc3590a6a9e0490ba058c6a59506bd0620bc09b1dc74
     spec:
       template:
         metadata:
           labels:
-            helm.sh/chart: kargo-1.0.3
+            helm.sh/chart: kargo-1.1.0
             app.kubernetes.io/name: kargo
             app.kubernetes.io/instance: release-name
-            app.kubernetes.io/version: "v1.0.3"
+            app.kubernetes.io/version: "v1.1.0"
             app.kubernetes.io/managed-by: Helm
             app.kubernetes.io/component: garbage-collector
           annotations:
             configmap/checksum: a825d50984da3ea04b6adc3590a6a9e0490ba058c6a59506bd0620bc09b1dc74
         spec:
           serviceAccountName: kargo-garbage-collector
           containers:
           - name: garbage-collector
-            image: ghcr.io/akuity/kargo:v1.0.3
+            image: ghcr.io/akuity/kargo:v1.1.0
             imagePullPolicy: IfNotPresent
-            command: ["/usr/local/bin/kargo", "garbage-collector"]
+            command: ["/sbin/tini", "--", "/usr/local/bin/kargo"]
+            args: ["garbage-collector"]
+            env:
+            - name: GOMEMLIMIT
+              valueFrom:
+                resourceFieldRef:
+                  containerName: garbage-collector
+                  resource: limits.memory
+            - name: GOMAXPROCS
+              valueFrom:
+                resourceFieldRef:
+                  containerName: garbage-collector
+                  resource: limits.cpu
             envFrom:
             - configMapRef:
                 name: kargo-garbage-collector
             resources:
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/service-account.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/service-account.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/service-account.yaml	2024-12-06 19:13:47.108887137 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/service-account.yaml	2024-12-06 19:13:12.716887854 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/service-account.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/service-account.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/service-account.yaml	2024-12-06 19:13:47.288887080 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/service-account.yaml	2024-12-06 19:13:12.892887794 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-garbage-collector
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-role-bindings.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-role-bindings.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-role-bindings.yaml	2024-12-06 19:13:47.292887078 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-role-bindings.yaml	2024-12-06 19:13:12.896887793 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-management-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-roles.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-roles.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-roles.yaml	2024-12-06 19:13:47.292887078 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-roles.yaml	2024-12-06 19:13:12.896887793 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-management-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/configmap.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/configmap.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/configmap.yaml	2024-12-06 19:13:47.288887080 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/configmap.yaml	2024-12-06 19:13:12.896887793 +0000
@@ -5,13 +5,16 @@
 metadata:
   name: kargo-management-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
 data:
   KARGO_NAMESPACE: default
   LOG_LEVEL: "INFO"
+  MAX_CONCURRENT_NAMESPACE_RECONCILES: "4"
+  MAX_CONCURRENT_PROJECT_RECONCILES: "4"
+  MAX_CONCURRENT_SERVICE_ACCOUNT_RECONCILES: "4"
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/deployment.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/deployment.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/deployment.yaml	2024-12-06 19:13:47.292887078 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/deployment.yaml	2024-12-06 19:13:12.896887793 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-management-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
 spec:
   replicas: 1
@@ -27,16 +27,28 @@
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
         app.kubernetes.io/component: management-controller
       annotations:
-        configmap/checksum: f12f16e41a5ad2eafe250dc88ee5bbb12da69eef9a24cdd7fe31d77b4af02ef0
+        configmap/checksum: bcf468b0c814c0cda7c1733b1393de92d5d51cfc38ed6b66c2891b895d9071ff
     spec:
       serviceAccount: kargo-management-controller
       containers:
       - name: management-controller
-        image: ghcr.io/akuity/kargo:v1.0.3
+        image: ghcr.io/akuity/kargo:v1.1.0
         imagePullPolicy: IfNotPresent
-        command: ["/usr/local/bin/kargo", "management-controller"]
+        command: ["/sbin/tini", "--", "/usr/local/bin/kargo"]
+        args: ["management-controller"]
+        env:
+        - name: GOMEMLIMIT
+          valueFrom:
+            resourceFieldRef:
+              containerName: management-controller
+              resource: limits.memory
+        - name: GOMAXPROCS
+          valueFrom:
+            resourceFieldRef:
+              containerName: management-controller
+              resource: limits.cpu
         envFrom:
         - configMapRef:
             name: kargo-management-controller
         resources:
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/service-account.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/service-account.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/service-account.yaml	2024-12-06 19:13:47.288887080 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/service-account.yaml	2024-12-06 19:13:12.892887794 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-management-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/users/cluster-role-bindings.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/users/cluster-role-bindings.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/users/cluster-role-bindings.yaml	2024-12-06 19:13:47.292887078 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/users/cluster-role-bindings.yaml	2024-12-06 19:13:12.896887793 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-admin
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
@@ -24,12 +24,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-viewer
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/users/cluster-roles.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/users/cluster-roles.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/users/cluster-roles.yaml	2024-12-06 19:13:47.292887078 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/users/cluster-roles.yaml	2024-12-06 19:13:12.896887793 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-admin
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
 rules:
 - apiGroups:
   - ""
@@ -84,12 +84,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-viewer
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
 rules:
 - apiGroups:
   - ""
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/users/service-accounts.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/users/service-accounts.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/users/service-accounts.yaml	2024-12-06 19:13:47.288887080 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/users/service-accounts.yaml	2024-12-06 19:13:12.892887794 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-admin
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
 ---
 # Source: sx-kargo/charts/kargo/templates/users/service-accounts.yaml
 apiVersion: v1
@@ -18,9 +18,9 @@
 metadata:
   name: kargo-viewer
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks/webhooks.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks/webhooks.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks/webhooks.yaml	2024-12-06 19:13:47.292887078 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks/webhooks.yaml	2024-12-06 19:13:12.896887793 +0000
@@ -4,12 +4,12 @@
 kind: MutatingWebhookConfiguration
 metadata:
   name: kargo
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
   annotations:
     cert-manager.io/inject-ca-from: default/kargo-webhooks-server
@@ -80,12 +80,12 @@
 kind: ValidatingWebhookConfiguration
 metadata:
   name: kargo
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
   annotations:
     cert-manager.io/inject-ca-from: default/kargo-webhooks-server
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/crds.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/crds.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/crds.yaml	2024-12-06 19:13:47.108887137 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/crds.yaml	2024-12-06 19:13:12.716887854 +0000
@@ -3,9 +3,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: freights.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -205,9 +205,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: projects.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -373,9 +373,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: promotions.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -460,10 +460,58 @@
                     as:
                       description: As is the alias this step can be referred to as.
                       type: string
                     config:
-                      description: Config is the configuration for the directive.
+                      description: |-
+                        Config is opaque configuration for the PromotionStep that is understood
+                        only by each PromotionStep's implementation. It is legal to utilize
+                        expressions in defining values at any level of this block.
+                        See https://docs.kargo.io/references/expression-language for details.
                       x-kubernetes-preserve-unknown-fields: true
+                    retry:
+                      description: Retry is the retry policy for this step.
+                      properties:
+                        errorThreshold:
+                          description: |-
+                            ErrorThreshold is the number of consecutive times the step must fail (for
+                            any reason) before retries are abandoned and the entire Promotion is marked
+                            as failed.
+
+                            If this field is set to 0, the effective default will be a step-specific
+                            one. If no step-specific default exists (i.e. is also 0), the effective
+                            default will be the system-wide default of 1.
+
+                            A value of 1 will cause the Promotion to be marked as failed after just
+                            a single failure; i.e. no retries will be attempted.
+
+                            There is no option to specify an infinite number of retries using a value
+                            such as -1.
+
+                            In a future release, Kargo is likely to become capable of distinguishing
+                            between recoverable and non-recoverable step failures. At that time, it is
+                            planned that unrecoverable failures will not be subject to this threshold
+                            and will immediately cause the Promotion to be marked as failed without
+                            further condition.
+                          format: int32
+                          type: integer
+                        timeout:
+                          description: |-
+                            Timeout is the soft maximum interval in which a step that returns a Running
+                            status (which typically indicates it's waiting for something to happen)
+                            may be retried.
+
+                            The maximum is a soft one because the check for whether the interval has
+                            elapsed occurs AFTER the step has run. This effectively means a step may
+                            run ONCE beyond the close of the interval.
+
+                            If this field is set to nil, the effective default will be a step-specific
+                            one. If no step-specific default exists (i.e. is also nil), the effective
+                            default will be the system-wide default of 0.
+
+                            A value of 0 will cause the step to be retried indefinitely unless the
+                            ErrorThreshold is reached.
+                          type: string
+                      type: object
                     uses:
                       description: Uses identifies a runner that can execute this
                         step.
                       minLength: 1
@@ -471,8 +519,33 @@
                   required:
                   - uses
                   type: object
                 type: array
+              vars:
+                description: |-
+                  Vars is a list of variables that can be referenced by expressions in
+                  promotion steps.
+                items:
+                  description: |-
+                    PromotionVariable describes a single variable that may be referenced by
+                    expressions in promotion steps.
+                  properties:
+                    name:
+                      description: Name is the name of the variable.
+                      minLength: 1
+                      pattern: ^[a-zA-Z_]\w*$
+                      type: string
+                    value:
+                      description: |-
+                        Value is the value of the variable. It is allowed to utilize expressions
+                        in the value.
+                        See https://docs.kargo.io/references/expression-language for details.
+                      type: string
+                  required:
+                  - name
+                  - value
+                  type: object
+                type: array
             required:
             - freight
             - stage
             type: object
@@ -857,8 +930,46 @@
                 description: |-
                   State stores the state of the promotion process between reconciliation
                   attempts.
                 x-kubernetes-preserve-unknown-fields: true
+              stepExecutionMetadata:
+                description: |-
+                  StepExecutionMetadata tracks metadata pertaining to the execution
+                  of individual promotion steps.
+                items:
+                  description: |-
+                    StepExecutionMetadata tracks metadata pertaining to the execution of
+                    a promotion step.
+                  properties:
+                    alias:
+                      description: Alias is the alias of the step.
+                      type: string
+                    errorCount:
+                      description: ErrorCount tracks consecutive failed attempts to
+                        execute the step.
+                      format: int32
+                      type: integer
+                    finishedAt:
+                      description: |-
+                        FinishedAt is the time at which the final attempt to execute the step
+                        completed.
+                      format: date-time
+                      type: string
+                    message:
+                      description: Message is a display message about the step, including
+                        any errors.
+                      type: string
+                    startedAt:
+                      description: |-
+                        StartedAt is the time at which the first attempt to execute the step
+                        began.
+                      format: date-time
+                      type: string
+                    status:
+                      description: Status is the high-level outcome of the step.
+                      type: string
+                  type: object
+                type: array
             type: object
         required:
         - spec
         type: object
@@ -871,9 +982,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: stages.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -951,10 +1062,58 @@
                               description: As is the alias this step can be referred
                                 to as.
                               type: string
                             config:
-                              description: Config is the configuration for the directive.
+                              description: |-
+                                Config is opaque configuration for the PromotionStep that is understood
+                                only by each PromotionStep's implementation. It is legal to utilize
+                                expressions in defining values at any level of this block.
+                                See https://docs.kargo.io/references/expression-language for details.
                               x-kubernetes-preserve-unknown-fields: true
+                            retry:
+                              description: Retry is the retry policy for this step.
+                              properties:
+                                errorThreshold:
+                                  description: |-
+                                    ErrorThreshold is the number of consecutive times the step must fail (for
+                                    any reason) before retries are abandoned and the entire Promotion is marked
+                                    as failed.
+
+                                    If this field is set to 0, the effective default will be a step-specific
+                                    one. If no step-specific default exists (i.e. is also 0), the effective
+                                    default will be the system-wide default of 1.
+
+                                    A value of 1 will cause the Promotion to be marked as failed after just
+                                    a single failure; i.e. no retries will be attempted.
+
+                                    There is no option to specify an infinite number of retries using a value
+                                    such as -1.
+
+                                    In a future release, Kargo is likely to become capable of distinguishing
+                                    between recoverable and non-recoverable step failures. At that time, it is
+                                    planned that unrecoverable failures will not be subject to this threshold
+                                    and will immediately cause the Promotion to be marked as failed without
+                                    further condition.
+                                  format: int32
+                                  type: integer
+                                timeout:
+                                  description: |-
+                                    Timeout is the soft maximum interval in which a step that returns a Running
+                                    status (which typically indicates it's waiting for something to happen)
+                                    may be retried.
+
+                                    The maximum is a soft one because the check for whether the interval has
+                                    elapsed occurs AFTER the step has run. This effectively means a step may
+                                    run ONCE beyond the close of the interval.
+
+                                    If this field is set to nil, the effective default will be a step-specific
+                                    one. If no step-specific default exists (i.e. is also nil), the effective
+                                    default will be the system-wide default of 0.
+
+                                    A value of 0 will cause the step to be retried indefinitely unless the
+                                    ErrorThreshold is reached.
+                                  type: string
+                              type: object
                             uses:
                               description: Uses identifies a runner that can execute
                                 this step.
                               minLength: 1
@@ -963,8 +1122,33 @@
                           - uses
                           type: object
                         minItems: 1
                         type: array
+                      vars:
+                        description: |-
+                          Vars is a list of variables that can be referenced by expressions in
+                          promotion steps.
+                        items:
+                          description: |-
+                            PromotionVariable describes a single variable that may be referenced by
+                            expressions in promotion steps.
+                          properties:
+                            name:
+                              description: Name is the name of the variable.
+                              minLength: 1
+                              pattern: ^[a-zA-Z_]\w*$
+                              type: string
+                            value:
+                              description: |-
+                                Value is the value of the variable. It is allowed to utilize expressions
+                                in the value.
+                                See https://docs.kargo.io/references/expression-language for details.
+                              type: string
+                          required:
+                          - name
+                          - value
+                          type: object
+                        type: array
                     type: object
                 required:
                 - spec
                 type: object
@@ -1104,8 +1288,70 @@
           status:
             description: Status describes the Stage's current and recent Freight,
               health, and more.
             properties:
+              conditions:
+                description: |-
+                  Conditions contains the last observations of the Stage's current
+                  state.
+                items:
+                  description: Condition contains details for one aspect of the current
+                    state of this API Resource.
+                  properties:
+                    lastTransitionTime:
+                      description: |-
+                        lastTransitionTime is the last time the condition transitioned from one status to another.
+                        This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.
+                      format: date-time
+                      type: string
+                    message:
+                      description: |-
+                        message is a human readable message indicating details about the transition.
+                        This may be an empty string.
+                      maxLength: 32768
+                      type: string
+                    observedGeneration:
+                      description: |-
+                        observedGeneration represents the .metadata.generation that the condition was set based upon.
+                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date
+                        with respect to the current state of the instance.
+                      format: int64
+                      minimum: 0
+                      type: integer
+                    reason:
+                      description: |-
+                        reason contains a programmatic identifier indicating the reason for the condition's last transition.
+                        Producers of specific condition types may define expected values and meanings for this field,
+                        and whether the values are considered a guaranteed API.
+                        The value should be a CamelCase string.
+                        This field may not be empty.
+                      maxLength: 1024
+                      minLength: 1
+                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
+                      type: string
+                    status:
+                      description: status of the condition, one of True, False, Unknown.
+                      enum:
+                      - "True"
+                      - "False"
+                      - Unknown
+                      type: string
+                    type:
+                      description: type of condition in CamelCase or in foo.example.com/CamelCase.
+                      maxLength: 316
+                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
+                      type: string
+                  required:
+                  - lastTransitionTime
+                  - message
+                  - reason
+                  - status
+                  - type
+                  type: object
+                type: array
+                x-kubernetes-list-map-keys:
+                - type
+                x-kubernetes-list-type: map
               currentPromotion:
                 description: CurrentPromotion is a reference to the currently Running
                   promotion.
                 properties:
@@ -1625,8 +1871,47 @@
                         description: |-
                           State stores the state of the promotion process between reconciliation
                           attempts.
                         x-kubernetes-preserve-unknown-fields: true
+                      stepExecutionMetadata:
+                        description: |-
+                          StepExecutionMetadata tracks metadata pertaining to the execution
+                          of individual promotion steps.
+                        items:
+                          description: |-
+                            StepExecutionMetadata tracks metadata pertaining to the execution of
+                            a promotion step.
+                          properties:
+                            alias:
+                              description: Alias is the alias of the step.
+                              type: string
+                            errorCount:
+                              description: ErrorCount tracks consecutive failed attempts
+                                to execute the step.
+                              format: int32
+                              type: integer
+                            finishedAt:
+                              description: |-
+                                FinishedAt is the time at which the final attempt to execute the step
+                                completed.
+                              format: date-time
+                              type: string
+                            message:
+                              description: Message is a display message about the
+                                step, including any errors.
+                              type: string
+                            startedAt:
+                              description: |-
+                                StartedAt is the time at which the first attempt to execute the step
+                                began.
+                              format: date-time
+                              type: string
+                            status:
+                              description: Status is the high-level outcome of the
+                                step.
+                              type: string
+                          type: object
+                        type: array
                     type: object
                 required:
                 - name
                 type: object
@@ -1857,51 +2142,8 @@
                 type: string
               health:
                 description: Health is the Stage's last observed health.
                 properties:
-                  argoCDApps:
-                    description: ArgoCDApps describes the current state of any related
-                      ArgoCD Applications.
-                    items:
-                      description: ArgoCDAppStatus describes the current state of
-                        a single ArgoCD Application.
-                      properties:
-                        healthStatus:
-                          description: HealthStatus is the health of the ArgoCD Application.
-                          properties:
-                            message:
-                              type: string
-                            status:
-                              type: string
-                          required:
-                          - status
-                          type: object
-                        name:
-                          description: Name is the name of the ArgoCD Application.
-                          type: string
-                        namespace:
-                          description: Namespace is the namespace of the ArgoCD Application.
-                          type: string
-                        syncStatus:
-                          description: SyncStatus is the sync status of the ArgoCD
-                            Application.
-                          properties:
-                            revision:
-                              type: string
-                            revisions:
-                              items:
-                                type: string
-                              type: array
-                            status:
-                              type: string
-                          required:
-                          - status
-                          type: object
-                      required:
-                      - name
-                      - namespace
-                      type: object
-                    type: array
                   config:
                     description: |-
                       Config is the opaque configuration of all health checks performed on this
                       Stage.
@@ -2446,8 +2688,47 @@
                         description: |-
                           State stores the state of the promotion process between reconciliation
                           attempts.
                         x-kubernetes-preserve-unknown-fields: true
+                      stepExecutionMetadata:
+                        description: |-
+                          StepExecutionMetadata tracks metadata pertaining to the execution
+                          of individual promotion steps.
+                        items:
+                          description: |-
+                            StepExecutionMetadata tracks metadata pertaining to the execution of
+                            a promotion step.
+                          properties:
+                            alias:
+                              description: Alias is the alias of the step.
+                              type: string
+                            errorCount:
+                              description: ErrorCount tracks consecutive failed attempts
+                                to execute the step.
+                              format: int32
+                              type: integer
+                            finishedAt:
+                              description: |-
+                                FinishedAt is the time at which the final attempt to execute the step
+                                completed.
+                              format: date-time
+                              type: string
+                            message:
+                              description: Message is a display message about the
+                                step, including any errors.
+                              type: string
+                            startedAt:
+                              description: |-
+                                StartedAt is the time at which the first attempt to execute the step
+                                began.
+                              format: date-time
+                              type: string
+                            status:
+                              description: Status is the high-level outcome of the
+                                step.
+                              type: string
+                          type: object
+                        type: array
                     type: object
                 required:
                 - name
                 type: object
@@ -2478,9 +2759,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: warehouses.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -2528,8 +2809,9 @@
                 description: |-
                   FreightCreationPolicy describes how Freight is created by this Warehouse.
                   This field is optional. When left unspecified, the field is implicitly
                   treated as if its value were "Automatic".
+                  Accepted values: Automatic, Manual
                 enum:
                 - Automatic
                 - Manual
                 type: string
@@ -2637,8 +2919,9 @@
                             CommitSelectionStrategy specifies the rules for how to identify the newest
                             commit of interest in the repository specified by the RepoURL field. This
                             field is optional. When left unspecified, the field is implicitly treated
                             as if its value were "NewestFromBranch".
+                            Accepted values: Lexical, NewestFromBranch, NewestTag, SemVer
                           enum:
                           - Lexical
                           - NewestFromBranch
                           - NewestTag
@@ -2782,8 +3065,9 @@
                             ImageSelectionStrategy specifies the rules for how to identify the newest version
                             of the image specified by the RepoURL field. This field is optional. When
                             left unspecified, the field is implicitly treated as if its value were
                             "SemVer".
+                            Accepted values: Digest, Lexical, NewestBuild, SemVer
                           enum:
                           - Digest
                           - Lexical
                           - NewestBuild
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role-binding.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role-binding.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role-binding.yaml	2024-12-06 19:13:47.292887078 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role-binding.yaml	2024-12-06 19:13:12.896887793 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-webhooks-server
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -25,12 +25,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-webhooks-server-ns-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -46,12 +46,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-webhooks-server-generic-gc
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role.yaml	2024-12-06 19:13:47.292887078 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role.yaml	2024-12-06 19:13:12.896887793 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-webhooks-server
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 rules:
 - apiGroups:
@@ -79,12 +79,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-webhooks-server-ns-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 rules:
 - apiGroups:
@@ -105,12 +105,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-webhooks-server-generic-gc
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/configmap.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/configmap.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/configmap.yaml	2024-12-06 19:13:47.288887080 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/configmap.yaml	2024-12-06 19:13:12.896887793 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-webhooks-server
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 data:
   KARGO_NAMESPACE: default
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/deployment.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/deployment.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/deployment.yaml	2024-12-06 19:13:47.292887078 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/deployment.yaml	2024-12-06 19:13:12.896887793 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-webhooks-server
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 spec:
   replicas: 1
@@ -23,23 +23,35 @@
       app.kubernetes.io/component: webhooks-server
   template:
     metadata:
       labels:
-        helm.sh/chart: kargo-1.0.3
+        helm.sh/chart: kargo-1.1.0
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
-        app.kubernetes.io/version: "v1.0.3"
+        app.kubernetes.io/version: "v1.1.0"
         app.kubernetes.io/managed-by: Helm
         app.kubernetes.io/component: webhooks-server
       annotations:
         configmap/checksum: 517e77c4dd49419d768a458d24a72e747c19a23a0eb5f022b3fe25fd49dd5a7c
     spec:
       serviceAccount: kargo-webhooks-server
       containers:
       - name: webhooks-server
-        image: ghcr.io/akuity/kargo:v1.0.3
+        image: ghcr.io/akuity/kargo:v1.1.0
         imagePullPolicy: IfNotPresent
-        command: ["/usr/local/bin/kargo", "webhooks-server"]
+        command: ["/sbin/tini", "--", "/usr/local/bin/kargo"]
+        args: ["webhooks-server"]
+        env:
+        - name: GOMEMLIMIT
+          valueFrom:
+            resourceFieldRef:
+              containerName: webhooks-server
+              resource: limits.memory
+        - name: GOMAXPROCS
+          valueFrom:
+            resourceFieldRef:
+              containerName: webhooks-server
+              resource: limits.cpu
         envFrom:
         - configMapRef:
             name: kargo-webhooks-server
         ports:
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service-account.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service-account.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service-account.yaml	2024-12-06 19:13:47.288887080 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service-account.yaml	2024-12-06 19:13:12.892887794 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-webhooks-server
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service.yaml	2024-12-06 19:13:47.292887078 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service.yaml	2024-12-06 19:13:12.896887793 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-webhooks-server
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 spec:
   type: ClusterIP
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-role-bindings.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-role-bindings.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-role-bindings.yaml	2024-12-06 19:13:47.112887136 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-role-bindings.yaml	2024-12-06 19:13:12.716887854 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-garbage-collector
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-roles.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-roles.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-roles.yaml	2024-12-06 19:13:47.108887137 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-roles.yaml	2024-12-06 19:13:12.716887854 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-garbage-collector
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/configmap.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/configmap.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/configmap.yaml	2024-12-06 19:13:47.108887137 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/configmap.yaml	2024-12-06 19:13:12.716887854 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-garbage-collector
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
 data:
   LOG_LEVEL: "INFO"
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cron-job.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cron-job.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cron-job.yaml	2024-12-06 19:13:47.112887136 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cron-job.yaml	2024-12-06 19:13:12.716887854 +0000
@@ -5,47 +5,59 @@
 metadata:
   name: kargo-garbage-collector
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
 spec:
   schedule: "0 * * * *"
   concurrencyPolicy: Forbid
   jobTemplate:
     metadata:
       labels:
-        helm.sh/chart: kargo-1.0.3
+        helm.sh/chart: kargo-1.1.0
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
-        app.kubernetes.io/version: "v1.0.3"
+        app.kubernetes.io/version: "v1.1.0"
         app.kubernetes.io/managed-by: Helm
         app.kubernetes.io/component: garbage-collector
       annotations:
         configmap/checksum: a825d50984da3ea04b6adc3590a6a9e0490ba058c6a59506bd0620bc09b1dc74
     spec:
       template:
         metadata:
           labels:
-            helm.sh/chart: kargo-1.0.3
+            helm.sh/chart: kargo-1.1.0
             app.kubernetes.io/name: kargo
             app.kubernetes.io/instance: release-name
-            app.kubernetes.io/version: "v1.0.3"
+            app.kubernetes.io/version: "v1.1.0"
             app.kubernetes.io/managed-by: Helm
             app.kubernetes.io/component: garbage-collector
           annotations:
             configmap/checksum: a825d50984da3ea04b6adc3590a6a9e0490ba058c6a59506bd0620bc09b1dc74
         spec:
           serviceAccountName: kargo-garbage-collector
           containers:
           - name: garbage-collector
-            image: ghcr.io/akuity/kargo:v1.0.3
+            image: ghcr.io/akuity/kargo:v1.1.0
             imagePullPolicy: IfNotPresent
-            command: ["/usr/local/bin/kargo", "garbage-collector"]
+            command: ["/sbin/tini", "--", "/usr/local/bin/kargo"]
+            args: ["garbage-collector"]
+            env:
+            - name: GOMEMLIMIT
+              valueFrom:
+                resourceFieldRef:
+                  containerName: garbage-collector
+                  resource: limits.memory
+            - name: GOMAXPROCS
+              valueFrom:
+                resourceFieldRef:
+                  containerName: garbage-collector
+                  resource: limits.cpu
             envFrom:
             - configMapRef:
                 name: kargo-garbage-collector
             resources:
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/service-account.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/service-account.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/service-account.yaml	2024-12-06 19:13:47.108887137 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/service-account.yaml	2024-12-06 19:13:12.716887854 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-garbage-collector
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-role-bindings.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-role-bindings.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-role-bindings.yaml	2024-12-06 19:13:47.112887136 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-role-bindings.yaml	2024-12-06 19:13:12.716887854 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-management-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-roles.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-roles.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-roles.yaml	2024-12-06 19:13:47.108887137 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-roles.yaml	2024-12-06 19:13:12.716887854 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-management-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/configmap.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/configmap.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/configmap.yaml	2024-12-06 19:13:47.108887137 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/configmap.yaml	2024-12-06 19:13:12.716887854 +0000
@@ -5,13 +5,16 @@
 metadata:
   name: kargo-management-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
 data:
   KARGO_NAMESPACE: default
   LOG_LEVEL: "INFO"
+  MAX_CONCURRENT_NAMESPACE_RECONCILES: "4"
+  MAX_CONCURRENT_PROJECT_RECONCILES: "4"
+  MAX_CONCURRENT_SERVICE_ACCOUNT_RECONCILES: "4"

Copy link
Contributor

github-actions bot commented Dec 6, 2024

Changes Default Values
diff -U 4 -r out-default-values/target/kargo_kargo_default-values.out out-default-values/pr/kargo_kargo_default-values.out
--- out-default-values/target/kargo_kargo_default-values.out	2024-12-06 19:13:47.376887052 +0000
+++ out-default-values/pr/kargo_kargo_default-values.out	2024-12-06 19:13:12.976887766 +0000
@@ -312,9 +312,9 @@
       #     redirectURI: <http(s)>://<api.host>/dex/callback
       ## Azure Example
       # - id: microsoft
       #   name: microsoft
-      #   type: Microsoft
+      #   type: microsoft
       #   config:
       #     clientID: <your client ID>
       #     clientSecret: "$CLIENT_SECRET"
       #     redirectURI: <http(s)>://<api.host>/dex/callback
@@ -376,8 +376,25 @@
   globalCredentials:
     ## @param controller.globalCredentials.namespaces List of namespaces to look for shared credentials. Note that as of v1.0.0, the Kargo controller does not have cluster-wide access to Secrets. The controller receives read-only permission for Secrets on a per-Project basis as Projects are created. If you designate some namespaces as homes for "global" credentials, you will need to manually grant the controller permission to read Secrets in those namespaces.
     namespaces: []
 
+  ## Reconciler-specific settings
+  reconcilers:
+    ## @param controller.reconcilers.maxConcurrentReconciles specifies the maximum number of resources EACH of the controller's reconcilers can reconcile concurrently. This setting may also be overridden on a per-reconciler basis.
+    maxConcurrentReconciles: 4
+    controlFlowStages:
+      ## @param controller.reconcilers.controlFlowStages.maxConcurrentReconciles optionally overrides the maximum number of control flow Stage resources the controller can reconcile concurrently.
+      maxConcurrentReconciles:
+    promotions:
+      ## @param controller.reconcilers.promotions.maxConcurrentReconciles optionally overrides the maximum number of Promotion resources the controller can reconcile concurrently.
+      maxConcurrentReconciles:
+    stages:
+      ## @param controller.reconcilers.stages.maxConcurrentReconciles optionally overrides the maximum number of (non-control flow) Stage resources the controller can reconcile concurrently.
+      maxConcurrentReconciles:
+    warehouses:
+      ## @param controller.reconcilers.warehouses.maxConcurrentReconciles optionally overrides the maximum number of Warehouse resources the controller can reconcile concurrently.
+      maxConcurrentReconciles:
+
   gitClient:
     ## @param controller.gitClient.name Specifies the name of the Kargo controller (used when authoring Git commits).
     name: "Kargo"
     ## @param controller.gitClient.email Specifies the email of the Kargo controller (used when authoring Git commits).
@@ -464,8 +481,22 @@
   podLabels: {}
   ## @param managementController.podAnnotations Optional annotations to add to pods. Merges with `global.podAnnotations`, allowing you to override or add to the global annotations.
   podAnnotations: {}
 
+  ## Reconciler-specific settings
+  reconcilers:
+    ## @param managementController.reconcilers.maxConcurrentReconciles specifies the maximum number of resources EACH of the management controller's reconcilers can reconcile concurrently. This setting may also be overridden on a per-reconciler basis.
+    maxConcurrentReconciles: 4
+    namespaces:
+      ## @param managementController.reconcilers.namespaces.maxConcurrentReconciles optionally overrides the maximum number of Namespace resources the management controller can reconcile concurrently.
+      maxConcurrentReconciles:
+    projects:
+      ## @param managementController.reconcilers.projects.maxConcurrentReconciles optionally overrides the maximum number of Project resources the management controller can reconcile concurrently.
+      maxConcurrentReconciles:
+    serviceAccounts:
+      ## @param managementController.reconcilers.serviceAccounts.maxConcurrentReconciles optionally overrides the maximum number of ServiceAccount resources the management controller can reconcile concurrently.
+      maxConcurrentReconciles:
+
   ## @param managementController.securityContext Security context for management controller pods. Defaults to `global.securityContext`.
   securityContext: {}
 
   ## @param managementController.resources Resources limits and requests for the management controller containers.

Copy link
Contributor

github-actions bot commented Dec 6, 2024

Changes Rendered Chart
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/deployment.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/deployment.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/deployment.yaml	2024-12-06 19:13:47.112887136 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/deployment.yaml	2024-12-06 19:13:12.716887854 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-management-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
 spec:
   replicas: 1
@@ -27,16 +27,28 @@
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
         app.kubernetes.io/component: management-controller
       annotations:
-        configmap/checksum: f12f16e41a5ad2eafe250dc88ee5bbb12da69eef9a24cdd7fe31d77b4af02ef0
+        configmap/checksum: bcf468b0c814c0cda7c1733b1393de92d5d51cfc38ed6b66c2891b895d9071ff
     spec:
       serviceAccount: kargo-management-controller
       containers:
       - name: management-controller
-        image: ghcr.io/akuity/kargo:v1.0.3
+        image: ghcr.io/akuity/kargo:v1.1.0
         imagePullPolicy: IfNotPresent
-        command: ["/usr/local/bin/kargo", "management-controller"]
+        command: ["/sbin/tini", "--", "/usr/local/bin/kargo"]
+        args: ["management-controller"]
+        env:
+        - name: GOMEMLIMIT
+          valueFrom:
+            resourceFieldRef:
+              containerName: management-controller
+              resource: limits.memory
+        - name: GOMAXPROCS
+          valueFrom:
+            resourceFieldRef:
+              containerName: management-controller
+              resource: limits.cpu
         envFrom:
         - configMapRef:
             name: kargo-management-controller
         resources:
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/service-account.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/service-account.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/service-account.yaml	2024-12-06 19:13:47.108887137 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/service-account.yaml	2024-12-06 19:13:12.716887854 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-management-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/users/cluster-role-bindings.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/users/cluster-role-bindings.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/users/cluster-role-bindings.yaml	2024-12-06 19:13:47.112887136 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/users/cluster-role-bindings.yaml	2024-12-06 19:13:12.716887854 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-admin
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
@@ -24,12 +24,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-viewer
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/users/cluster-roles.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/users/cluster-roles.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/users/cluster-roles.yaml	2024-12-06 19:13:47.108887137 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/users/cluster-roles.yaml	2024-12-06 19:13:12.716887854 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-admin
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
 rules:
 - apiGroups:
   - ""
@@ -84,12 +84,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-viewer
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
 rules:
 - apiGroups:
   - ""
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/users/service-accounts.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/users/service-accounts.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/users/service-accounts.yaml	2024-12-06 19:13:47.108887137 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/users/service-accounts.yaml	2024-12-06 19:13:12.716887854 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-admin
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
 ---
 # Source: sx-kargo/charts/kargo/templates/users/service-accounts.yaml
 apiVersion: v1
@@ -18,9 +18,9 @@
 metadata:
   name: kargo-viewer
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks/webhooks.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks/webhooks.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks/webhooks.yaml	2024-12-06 19:13:47.112887136 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks/webhooks.yaml	2024-12-06 19:13:12.720887853 +0000
@@ -4,12 +4,12 @@
 kind: MutatingWebhookConfiguration
 metadata:
   name: kargo
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
   annotations:
     cert-manager.io/inject-ca-from: default/kargo-webhooks-server
@@ -80,12 +80,12 @@
 kind: ValidatingWebhookConfiguration
 metadata:
   name: kargo
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
   annotations:
     cert-manager.io/inject-ca-from: default/kargo-webhooks-server
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role-binding.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role-binding.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role-binding.yaml	2024-12-06 19:13:47.112887136 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role-binding.yaml	2024-12-06 19:13:12.716887854 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-webhooks-server
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -25,12 +25,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-webhooks-server-ns-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -46,12 +46,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-webhooks-server-generic-gc
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role.yaml	2024-12-06 19:13:47.108887137 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role.yaml	2024-12-06 19:13:12.716887854 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-webhooks-server
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 rules:
 - apiGroups:
@@ -79,12 +79,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-webhooks-server-ns-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 rules:
 - apiGroups:
@@ -105,12 +105,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-webhooks-server-generic-gc
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/configmap.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/configmap.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/configmap.yaml	2024-12-06 19:13:47.108887137 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/configmap.yaml	2024-12-06 19:13:12.716887854 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-webhooks-server
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 data:
   KARGO_NAMESPACE: default
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/deployment.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/deployment.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/deployment.yaml	2024-12-06 19:13:47.112887136 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/deployment.yaml	2024-12-06 19:13:12.716887854 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-webhooks-server
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 spec:
   replicas: 1
@@ -23,23 +23,35 @@
       app.kubernetes.io/component: webhooks-server
   template:
     metadata:
       labels:
-        helm.sh/chart: kargo-1.0.3
+        helm.sh/chart: kargo-1.1.0
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
-        app.kubernetes.io/version: "v1.0.3"
+        app.kubernetes.io/version: "v1.1.0"
         app.kubernetes.io/managed-by: Helm
         app.kubernetes.io/component: webhooks-server
       annotations:
         configmap/checksum: 517e77c4dd49419d768a458d24a72e747c19a23a0eb5f022b3fe25fd49dd5a7c
     spec:
       serviceAccount: kargo-webhooks-server
       containers:
       - name: webhooks-server
-        image: ghcr.io/akuity/kargo:v1.0.3
+        image: ghcr.io/akuity/kargo:v1.1.0
         imagePullPolicy: IfNotPresent
-        command: ["/usr/local/bin/kargo", "webhooks-server"]
+        command: ["/sbin/tini", "--", "/usr/local/bin/kargo"]
+        args: ["webhooks-server"]
+        env:
+        - name: GOMEMLIMIT
+          valueFrom:
+            resourceFieldRef:
+              containerName: webhooks-server
+              resource: limits.memory
+        - name: GOMAXPROCS
+          valueFrom:
+            resourceFieldRef:
+              containerName: webhooks-server
+              resource: limits.cpu
         envFrom:
         - configMapRef:
             name: kargo-webhooks-server
         ports:
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service-account.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service-account.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service-account.yaml	2024-12-06 19:13:47.108887137 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service-account.yaml	2024-12-06 19:13:12.716887854 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-webhooks-server
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service.yaml	2024-12-06 19:13:47.112887136 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service.yaml	2024-12-06 19:13:12.716887854 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-webhooks-server
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 spec:
   type: ClusterIP
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/cluster-role-binding.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/cluster-role-binding.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/cluster-role-binding.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/cluster-role-binding.yaml	2024-12-06 19:13:12.804887824 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-api
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -25,12 +25,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-api-rollouts
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/cluster-role.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/cluster-role.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/cluster-role.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/cluster-role.yaml	2024-12-06 19:13:12.804887824 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-api
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 rules:
   - apiGroups:
@@ -129,12 +129,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-project-admin
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 rules:
 - apiGroups:
@@ -158,12 +158,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-api-rollouts
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/configmap.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/configmap.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/configmap.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/configmap.yaml	2024-12-06 19:13:12.804887824 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 data:
   KARGO_NAMESPACE: default
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/deployment.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/deployment.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/deployment.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/deployment.yaml	2024-12-06 19:13:12.808887823 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 spec:
   replicas: 1
@@ -23,12 +23,12 @@
       app.kubernetes.io/component: api
   template:
     metadata:
       labels:
-        helm.sh/chart: kargo-1.0.3
+        helm.sh/chart: kargo-1.1.0
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
-        app.kubernetes.io/version: "v1.0.3"
+        app.kubernetes.io/version: "v1.1.0"
         app.kubernetes.io/managed-by: Helm
         app.kubernetes.io/component: api
       annotations:
         configmap/checksum: 161df4d5db34112702d7fabe496334e15b39354f5df79e0cd38e03bc93d413fd
@@ -36,11 +36,22 @@
     spec:
       serviceAccount: kargo-api
       containers:
         - name: api
-          image: ghcr.io/akuity/kargo:v1.0.3
+          image: ghcr.io/akuity/kargo:v1.1.0
           imagePullPolicy: IfNotPresent
           command: ["/usr/local/bin/kargo", "api"]
+          env:
+          - name: GOMEMLIMIT
+            valueFrom:
+              resourceFieldRef:
+                containerName: api
+                resource: limits.memory
+          - name: GOMAXPROCS
+            valueFrom:
+              resourceFieldRef:
+                containerName: api
+                resource: limits.cpu
           envFrom:
           - configMapRef:
               name: kargo-api
           - secretRef:
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/ingress.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/ingress.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/ingress.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/ingress.yaml	2024-12-06 19:13:12.808887823 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 spec:
   rules:
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/secret.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/secret.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/secret.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/secret.yaml	2024-12-06 19:13:12.804887824 +0000
@@ -6,12 +6,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 stringData:  
   ADMIN_ACCOUNT_PASSWORD_HASH: "$2y$10$7FtRo..bKM5qcrp8dv.7f.TDAQLRSge47Dpi8sLM4sWbWqd9kQAha"  
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/service-account.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/service-account.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/service-account.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/service-account.yaml	2024-12-06 19:13:12.804887824 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/service.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/service.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/service.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/service.yaml	2024-12-06 19:13:12.808887823 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 spec:
   type: ClusterIP
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/cluster-role-bindings.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/cluster-role-bindings.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/cluster-role-bindings.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/cluster-role-bindings.yaml	2024-12-06 19:13:12.804887824 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -25,12 +25,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-controller-argocd
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -46,12 +46,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-controller-rollouts
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/cluster-roles.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/cluster-roles.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/cluster-roles.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/cluster-roles.yaml	2024-12-06 19:13:12.804887824 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 rules:
 - apiGroups:
@@ -71,12 +71,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-controller-read-secrets
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 rules:
 - apiGroups:
@@ -93,12 +93,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-controller-argocd
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 rules:
 - apiGroups:
@@ -116,12 +116,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-controller-rollouts
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/configmap.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/configmap.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/configmap.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/configmap.yaml	2024-12-06 19:13:12.804887824 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 data:
   API_SERVER_BASE_URL: https://kargo-127-0-0-1.nip.io
@@ -23,4 +23,8 @@
   ARGOCD_NAMESPACE: argocd
   ARGOCD_WATCH_ARGOCD_NAMESPACE_ONLY: "false"
   ROLLOUTS_INTEGRATION_ENABLED: "true"
   ROLLOUTS_CONTROLLER_INSTANCE_ID: ""
+  MAX_CONCURRENT_CONTROL_FLOW_RECONCILES: "4"
+  MAX_CONCURRENT_PROMOTION_RECONCILES: "4"
+  MAX_CONCURRENT_STAGE_RECONCILES: "4"
+  MAX_CONCURRENT_WAREHOUSE_RECONCILES: "4"
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/deployment.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/deployment.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/deployment.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/deployment.yaml	2024-12-06 19:13:12.808887823 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 spec:
   replicas: 1
@@ -23,23 +23,35 @@
       app.kubernetes.io/component: controller
   template:
     metadata:
       labels:
-        helm.sh/chart: kargo-1.0.3
+        helm.sh/chart: kargo-1.1.0
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
-        app.kubernetes.io/version: "v1.0.3"
+        app.kubernetes.io/version: "v1.1.0"
         app.kubernetes.io/managed-by: Helm
         app.kubernetes.io/component: controller
       annotations:
-        configmap/checksum: 6dba877764f1f93fa0d507820c1d098f2c2ee5e65ecef1bb531b1abc574edd7d
+        configmap/checksum: c17c8514f9b79e3d252805ca089ba65e8b076956d44d22e370539e38815288fa
     spec:
       serviceAccount: kargo-controller
       containers:
       - name: controller
-        image: ghcr.io/akuity/kargo:v1.0.3
+        image: ghcr.io/akuity/kargo:v1.1.0
         imagePullPolicy: IfNotPresent
-        command: ["/usr/local/bin/kargo", "controller"]
+        command: ["/sbin/tini", "--", "/usr/local/bin/kargo"]
+        args: ["controller"]
+        env:
+        - name: GOMEMLIMIT
+          valueFrom:
+            resourceFieldRef:
+              containerName: controller
+              resource: limits.memory
+        - name: GOMAXPROCS
+          valueFrom:
+            resourceFieldRef:
+              containerName: controller
+              resource: limits.cpu
         envFrom:
         - configMapRef:
             name: kargo-controller
         resources:
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/service-account.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/service-account.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/service-account.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/service-account.yaml	2024-12-06 19:13:12.804887824 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/crds.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/crds.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/crds.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/crds.yaml	2024-12-06 19:13:12.804887824 +0000
@@ -3,9 +3,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: freights.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -205,9 +205,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: projects.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -373,9 +373,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: promotions.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -460,10 +460,58 @@
                     as:
                       description: As is the alias this step can be referred to as.
                       type: string
                     config:
-                      description: Config is the configuration for the directive.
+                      description: |-
+                        Config is opaque configuration for the PromotionStep that is understood
+                        only by each PromotionStep's implementation. It is legal to utilize
+                        expressions in defining values at any level of this block.
+                        See https://docs.kargo.io/references/expression-language for details.
                       x-kubernetes-preserve-unknown-fields: true
+                    retry:
+                      description: Retry is the retry policy for this step.
+                      properties:
+                        errorThreshold:
+                          description: |-
+                            ErrorThreshold is the number of consecutive times the step must fail (for
+                            any reason) before retries are abandoned and the entire Promotion is marked
+                            as failed.
+
+                            If this field is set to 0, the effective default will be a step-specific
+                            one. If no step-specific default exists (i.e. is also 0), the effective
+                            default will be the system-wide default of 1.
+
+                            A value of 1 will cause the Promotion to be marked as failed after just
+                            a single failure; i.e. no retries will be attempted.
+
+                            There is no option to specify an infinite number of retries using a value
+                            such as -1.
+
+                            In a future release, Kargo is likely to become capable of distinguishing
+                            between recoverable and non-recoverable step failures. At that time, it is
+                            planned that unrecoverable failures will not be subject to this threshold
+                            and will immediately cause the Promotion to be marked as failed without
+                            further condition.
+                          format: int32
+                          type: integer
+                        timeout:
+                          description: |-
+                            Timeout is the soft maximum interval in which a step that returns a Running
+                            status (which typically indicates it's waiting for something to happen)
+                            may be retried.
+
+                            The maximum is a soft one because the check for whether the interval has
+                            elapsed occurs AFTER the step has run. This effectively means a step may
+                            run ONCE beyond the close of the interval.
+
+                            If this field is set to nil, the effective default will be a step-specific
+                            one. If no step-specific default exists (i.e. is also nil), the effective
+                            default will be the system-wide default of 0.
+
+                            A value of 0 will cause the step to be retried indefinitely unless the
+                            ErrorThreshold is reached.
+                          type: string
+                      type: object
                     uses:
                       description: Uses identifies a runner that can execute this
                         step.
                       minLength: 1
@@ -471,8 +519,33 @@
                   required:
                   - uses
                   type: object
                 type: array
+              vars:
+                description: |-
+                  Vars is a list of variables that can be referenced by expressions in
+                  promotion steps.
+                items:
+                  description: |-
+                    PromotionVariable describes a single variable that may be referenced by
+                    expressions in promotion steps.
+                  properties:
+                    name:
+                      description: Name is the name of the variable.
+                      minLength: 1
+                      pattern: ^[a-zA-Z_]\w*$
+                      type: string
+                    value:
+                      description: |-
+                        Value is the value of the variable. It is allowed to utilize expressions
+                        in the value.
+                        See https://docs.kargo.io/references/expression-language for details.
+                      type: string
+                  required:
+                  - name
+                  - value
+                  type: object
+                type: array
             required:
             - freight
             - stage
             type: object
@@ -857,8 +930,46 @@
                 description: |-
                   State stores the state of the promotion process between reconciliation
                   attempts.
                 x-kubernetes-preserve-unknown-fields: true
+              stepExecutionMetadata:
+                description: |-
+                  StepExecutionMetadata tracks metadata pertaining to the execution
+                  of individual promotion steps.
+                items:
+                  description: |-
+                    StepExecutionMetadata tracks metadata pertaining to the execution of
+                    a promotion step.
+                  properties:
+                    alias:
+                      description: Alias is the alias of the step.
+                      type: string
+                    errorCount:
+                      description: ErrorCount tracks consecutive failed attempts to
+                        execute the step.
+                      format: int32
+                      type: integer
+                    finishedAt:
+                      description: |-
+                        FinishedAt is the time at which the final attempt to execute the step
+                        completed.
+                      format: date-time
+                      type: string
+                    message:
+                      description: Message is a display message about the step, including
+                        any errors.
+                      type: string
+                    startedAt:
+                      description: |-
+                        StartedAt is the time at which the first attempt to execute the step
+                        began.
+                      format: date-time
+                      type: string
+                    status:
+                      description: Status is the high-level outcome of the step.
+                      type: string
+                  type: object
+                type: array
             type: object
         required:
         - spec
         type: object
@@ -871,9 +982,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: stages.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -951,10 +1062,58 @@
                               description: As is the alias this step can be referred
                                 to as.
                               type: string
                             config:
-                              description: Config is the configuration for the directive.
+                              description: |-
+                                Config is opaque configuration for the PromotionStep that is understood
+                                only by each PromotionStep's implementation. It is legal to utilize
+                                expressions in defining values at any level of this block.
+                                See https://docs.kargo.io/references/expression-language for details.
                               x-kubernetes-preserve-unknown-fields: true
+                            retry:
+                              description: Retry is the retry policy for this step.
+                              properties:
+                                errorThreshold:
+                                  description: |-
+                                    ErrorThreshold is the number of consecutive times the step must fail (for
+                                    any reason) before retries are abandoned and the entire Promotion is marked
+                                    as failed.
+
+                                    If this field is set to 0, the effective default will be a step-specific
+                                    one. If no step-specific default exists (i.e. is also 0), the effective
+                                    default will be the system-wide default of 1.
+
+                                    A value of 1 will cause the Promotion to be marked as failed after just
+                                    a single failure; i.e. no retries will be attempted.
+
+                                    There is no option to specify an infinite number of retries using a value
+                                    such as -1.
+
+                                    In a future release, Kargo is likely to become capable of distinguishing
+                                    between recoverable and non-recoverable step failures. At that time, it is
+                                    planned that unrecoverable failures will not be subject to this threshold
+                                    and will immediately cause the Promotion to be marked as failed without
+                                    further condition.
+                                  format: int32
+                                  type: integer
+                                timeout:
+                                  description: |-
+                                    Timeout is the soft maximum interval in which a step that returns a Running
+                                    status (which typically indicates it's waiting for something to happen)
+                                    may be retried.
+
+                                    The maximum is a soft one because the check for whether the interval has
+                                    elapsed occurs AFTER the step has run. This effectively means a step may
+                                    run ONCE beyond the close of the interval.
+
+                                    If this field is set to nil, the effective default will be a step-specific
+                                    one. If no step-specific default exists (i.e. is also nil), the effective
+                                    default will be the system-wide default of 0.
+
+                                    A value of 0 will cause the step to be retried indefinitely unless the
+                                    ErrorThreshold is reached.
+                                  type: string
+                              type: object
                             uses:
                               description: Uses identifies a runner that can execute
                                 this step.
                               minLength: 1
@@ -963,8 +1122,33 @@
                           - uses
                           type: object
                         minItems: 1
                         type: array
+                      vars:
+                        description: |-
+                          Vars is a list of variables that can be referenced by expressions in
+                          promotion steps.
+                        items:
+                          description: |-
+                            PromotionVariable describes a single variable that may be referenced by
+                            expressions in promotion steps.
+                          properties:
+                            name:
+                              description: Name is the name of the variable.
+                              minLength: 1
+                              pattern: ^[a-zA-Z_]\w*$
+                              type: string
+                            value:
+                              description: |-
+                                Value is the value of the variable. It is allowed to utilize expressions
+                                in the value.
+                                See https://docs.kargo.io/references/expression-language for details.
+                              type: string
+                          required:
+                          - name
+                          - value
+                          type: object
+                        type: array
                     type: object
                 required:
                 - spec
                 type: object
@@ -1104,8 +1288,70 @@
           status:
             description: Status describes the Stage's current and recent Freight,
               health, and more.
             properties:
+              conditions:
+                description: |-
+                  Conditions contains the last observations of the Stage's current
+                  state.
+                items:
+                  description: Condition contains details for one aspect of the current
+                    state of this API Resource.
+                  properties:
+                    lastTransitionTime:
+                      description: |-
+                        lastTransitionTime is the last time the condition transitioned from one status to another.
+                        This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.
+                      format: date-time
+                      type: string
+                    message:
+                      description: |-
+                        message is a human readable message indicating details about the transition.
+                        This may be an empty string.
+                      maxLength: 32768
+                      type: string
+                    observedGeneration:
+                      description: |-
+                        observedGeneration represents the .metadata.generation that the condition was set based upon.
+                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date
+                        with respect to the current state of the instance.
+                      format: int64
+                      minimum: 0
+                      type: integer
+                    reason:
+                      description: |-
+                        reason contains a programmatic identifier indicating the reason for the condition's last transition.
+                        Producers of specific condition types may define expected values and meanings for this field,
+                        and whether the values are considered a guaranteed API.
+                        The value should be a CamelCase string.
+                        This field may not be empty.
+                      maxLength: 1024
+                      minLength: 1
+                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
+                      type: string
+                    status:
+                      description: status of the condition, one of True, False, Unknown.
+                      enum:
+                      - "True"
+                      - "False"
+                      - Unknown
+                      type: string
+                    type:
+                      description: type of condition in CamelCase or in foo.example.com/CamelCase.
+                      maxLength: 316
+                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
+                      type: string
+                  required:
+                  - lastTransitionTime
+                  - message
+                  - reason
+                  - status
+                  - type
+                  type: object
+                type: array
+                x-kubernetes-list-map-keys:
+                - type
+                x-kubernetes-list-type: map
               currentPromotion:
                 description: CurrentPromotion is a reference to the currently Running
                   promotion.
                 properties:
@@ -1625,8 +1871,47 @@
                         description: |-
                           State stores the state of the promotion process between reconciliation
                           attempts.
                         x-kubernetes-preserve-unknown-fields: true
+                      stepExecutionMetadata:
+                        description: |-
+                          StepExecutionMetadata tracks metadata pertaining to the execution
+                          of individual promotion steps.
+                        items:
+                          description: |-
+                            StepExecutionMetadata tracks metadata pertaining to the execution of
+                            a promotion step.
+                          properties:
+                            alias:
+                              description: Alias is the alias of the step.
+                              type: string
+                            errorCount:
+                              description: ErrorCount tracks consecutive failed attempts
+                                to execute the step.
+                              format: int32
+                              type: integer
+                            finishedAt:
+                              description: |-
+                                FinishedAt is the time at which the final attempt to execute the step
+                                completed.
+                              format: date-time
+                              type: string
+                            message:
+                              description: Message is a display message about the
+                                step, including any errors.
+                              type: string
+                            startedAt:
+                              description: |-
+                                StartedAt is the time at which the first attempt to execute the step
+                                began.
+                              format: date-time
+                              type: string
+                            status:
+                              description: Status is the high-level outcome of the
+                                step.
+                              type: string
+                          type: object
+                        type: array
                     type: object
                 required:
                 - name
                 type: object
@@ -1857,51 +2142,8 @@
                 type: string
               health:
                 description: Health is the Stage's last observed health.
                 properties:
-                  argoCDApps:
-                    description: ArgoCDApps describes the current state of any related
-                      ArgoCD Applications.
-                    items:
-                      description: ArgoCDAppStatus describes the current state of
-                        a single ArgoCD Application.
-                      properties:
-                        healthStatus:
-                          description: HealthStatus is the health of the ArgoCD Application.
-                          properties:
-                            message:
-                              type: string
-                            status:
-                              type: string
-                          required:
-                          - status
-                          type: object
-                        name:
-                          description: Name is the name of the ArgoCD Application.
-                          type: string
-                        namespace:
-                          description: Namespace is the namespace of the ArgoCD Application.
-                          type: string
-                        syncStatus:
-                          description: SyncStatus is the sync status of the ArgoCD
-                            Application.
-                          properties:
-                            revision:
-                              type: string
-                            revisions:
-                              items:
-                                type: string
-                              type: array
-                            status:
-                              type: string
-                          required:
-                          - status
-                          type: object
-                      required:
-                      - name
-                      - namespace
-                      type: object
-                    type: array
                   config:
                     description: |-
                       Config is the opaque configuration of all health checks performed on this
                       Stage.
@@ -2446,8 +2688,47 @@
                         description: |-
                           State stores the state of the promotion process between reconciliation
                           attempts.
                         x-kubernetes-preserve-unknown-fields: true
+                      stepExecutionMetadata:
+                        description: |-
+                          StepExecutionMetadata tracks metadata pertaining to the execution
+                          of individual promotion steps.
+                        items:
+                          description: |-
+                            StepExecutionMetadata tracks metadata pertaining to the execution of
+                            a promotion step.
+                          properties:
+                            alias:
+                              description: Alias is the alias of the step.
+                              type: string
+                            errorCount:
+                              description: ErrorCount tracks consecutive failed attempts
+                                to execute the step.
+                              format: int32
+                              type: integer
+                            finishedAt:
+                              description: |-
+                                FinishedAt is the time at which the final attempt to execute the step
+                                completed.
+                              format: date-time
+                              type: string
+                            message:
+                              description: Message is a display message about the
+                                step, including any errors.
+                              type: string
+                            startedAt:
+                              description: |-
+                                StartedAt is the time at which the first attempt to execute the step
+                                began.
+                              format: date-time
+                              type: string
+                            status:
+                              description: Status is the high-level outcome of the
+                                step.
+                              type: string
+                          type: object
+                        type: array
                     type: object
                 required:
                 - name
                 type: object
@@ -2478,9 +2759,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: warehouses.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -2528,8 +2809,9 @@
                 description: |-
                   FreightCreationPolicy describes how Freight is created by this Warehouse.
                   This field is optional. When left unspecified, the field is implicitly
                   treated as if its value were "Automatic".
+                  Accepted values: Automatic, Manual
                 enum:
                 - Automatic
                 - Manual
                 type: string
@@ -2637,8 +2919,9 @@
                             CommitSelectionStrategy specifies the rules for how to identify the newest
                             commit of interest in the repository specified by the RepoURL field. This
                             field is optional. When left unspecified, the field is implicitly treated
                             as if its value were "NewestFromBranch".
+                            Accepted values: Lexical, NewestFromBranch, NewestTag, SemVer
                           enum:
                           - Lexical
                           - NewestFromBranch
                           - NewestTag
@@ -2782,8 +3065,9 @@
                             ImageSelectionStrategy specifies the rules for how to identify the newest version
                             of the image specified by the RepoURL field. This field is optional. When
                             left unspecified, the field is implicitly treated as if its value were
                             "SemVer".
+                            Accepted values: Digest, Lexical, NewestBuild, SemVer
                           enum:
                           - Digest
                           - Lexical
                           - NewestBuild
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-role-bindings.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-role-bindings.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-role-bindings.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-role-bindings.yaml	2024-12-06 19:13:12.804887824 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-garbage-collector
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-roles.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-roles.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-roles.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-roles.yaml	2024-12-06 19:13:12.804887824 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-garbage-collector
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/configmap.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/configmap.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/configmap.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/configmap.yaml	2024-12-06 19:13:12.804887824 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-garbage-collector
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
 data:
   LOG_LEVEL: "INFO"
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cron-job.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cron-job.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cron-job.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cron-job.yaml	2024-12-06 19:13:12.808887823 +0000
@@ -5,47 +5,59 @@
 metadata:
   name: kargo-garbage-collector
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
 spec:
   schedule: "0 * * * *"
   concurrencyPolicy: Forbid
   jobTemplate:
     metadata:
       labels:
-        helm.sh/chart: kargo-1.0.3
+        helm.sh/chart: kargo-1.1.0
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
-        app.kubernetes.io/version: "v1.0.3"
+        app.kubernetes.io/version: "v1.1.0"
         app.kubernetes.io/managed-by: Helm
         app.kubernetes.io/component: garbage-collector
       annotations:
         configmap/checksum: a825d50984da3ea04b6adc3590a6a9e0490ba058c6a59506bd0620bc09b1dc74
     spec:
       template:
         metadata:
           labels:
-            helm.sh/chart: kargo-1.0.3
+            helm.sh/chart: kargo-1.1.0
             app.kubernetes.io/name: kargo
             app.kubernetes.io/instance: release-name
-            app.kubernetes.io/version: "v1.0.3"
+            app.kubernetes.io/version: "v1.1.0"
             app.kubernetes.io/managed-by: Helm
             app.kubernetes.io/component: garbage-collector
           annotations:
             configmap/checksum: a825d50984da3ea04b6adc3590a6a9e0490ba058c6a59506bd0620bc09b1dc74
         spec:
           serviceAccountName: kargo-garbage-collector
           containers:
           - name: garbage-collector
-            image: ghcr.io/akuity/kargo:v1.0.3
+            image: ghcr.io/akuity/kargo:v1.1.0
             imagePullPolicy: IfNotPresent
-            command: ["/usr/local/bin/kargo", "garbage-collector"]
+            command: ["/sbin/tini", "--", "/usr/local/bin/kargo"]
+            args: ["garbage-collector"]
+            env:
+            - name: GOMEMLIMIT
+              valueFrom:
+                resourceFieldRef:
+                  containerName: garbage-collector
+                  resource: limits.memory
+            - name: GOMAXPROCS
+              valueFrom:
+                resourceFieldRef:
+                  containerName: garbage-collector
+                  resource: limits.cpu
             envFrom:
             - configMapRef:
                 name: kargo-garbage-collector
             resources:
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/service-account.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/service-account.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/service-account.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/service-account.yaml	2024-12-06 19:13:12.804887824 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-garbage-collector
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-role-bindings.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-role-bindings.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-role-bindings.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-role-bindings.yaml	2024-12-06 19:13:12.808887823 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-management-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-roles.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-roles.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-roles.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-roles.yaml	2024-12-06 19:13:12.804887824 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-management-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/configmap.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/configmap.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/configmap.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/configmap.yaml	2024-12-06 19:13:12.804887824 +0000
@@ -5,13 +5,16 @@
 metadata:
   name: kargo-management-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
 data:
   KARGO_NAMESPACE: default
   LOG_LEVEL: "INFO"
+  MAX_CONCURRENT_NAMESPACE_RECONCILES: "4"
+  MAX_CONCURRENT_PROJECT_RECONCILES: "4"
+  MAX_CONCURRENT_SERVICE_ACCOUNT_RECONCILES: "4"
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/deployment.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/deployment.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/deployment.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/deployment.yaml	2024-12-06 19:13:12.808887823 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-management-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
 spec:
   replicas: 1
@@ -27,16 +27,28 @@
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
         app.kubernetes.io/component: management-controller
       annotations:
-        configmap/checksum: f12f16e41a5ad2eafe250dc88ee5bbb12da69eef9a24cdd7fe31d77b4af02ef0
+        configmap/checksum: bcf468b0c814c0cda7c1733b1393de92d5d51cfc38ed6b66c2891b895d9071ff
     spec:
       serviceAccount: kargo-management-controller
       containers:
       - name: management-controller
-        image: ghcr.io/akuity/kargo:v1.0.3
+        image: ghcr.io/akuity/kargo:v1.1.0
         imagePullPolicy: IfNotPresent
-        command: ["/usr/local/bin/kargo", "management-controller"]
+        command: ["/sbin/tini", "--", "/usr/local/bin/kargo"]
+        args: ["management-controller"]
+        env:
+        - name: GOMEMLIMIT
+          valueFrom:
+            resourceFieldRef:
+              containerName: management-controller
+              resource: limits.memory
+        - name: GOMAXPROCS
+          valueFrom:
+            resourceFieldRef:
+              containerName: management-controller
+              resource: limits.cpu
         envFrom:
         - configMapRef:
             name: kargo-management-controller
         resources:
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/service-account.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/service-account.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/service-account.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/service-account.yaml	2024-12-06 19:13:12.804887824 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-management-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/users/cluster-role-bindings.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/users/cluster-role-bindings.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/users/cluster-role-bindings.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/users/cluster-role-bindings.yaml	2024-12-06 19:13:12.808887823 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-admin
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
@@ -24,12 +24,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-viewer
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/users/cluster-roles.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/users/cluster-roles.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/users/cluster-roles.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/users/cluster-roles.yaml	2024-12-06 19:13:12.804887824 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-admin
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
 rules:
 - apiGroups:
   - ""
@@ -84,12 +84,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-viewer
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
 rules:
 - apiGroups:
   - ""
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/users/service-accounts.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/users/service-accounts.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/users/service-accounts.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/users/service-accounts.yaml	2024-12-06 19:13:12.804887824 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-admin
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
 ---
 # Source: sx-kargo/charts/kargo/templates/users/service-accounts.yaml
 apiVersion: v1
@@ -18,9 +18,9 @@
 metadata:
   name: kargo-viewer
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks/webhooks.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks/webhooks.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks/webhooks.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks/webhooks.yaml	2024-12-06 19:13:12.808887823 +0000
@@ -4,12 +4,12 @@
 kind: MutatingWebhookConfiguration
 metadata:
   name: kargo
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
   annotations:
     cert-manager.io/inject-ca-from: default/kargo-webhooks-server
@@ -80,12 +80,12 @@
 kind: ValidatingWebhookConfiguration
 metadata:
   name: kargo
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
   annotations:
     cert-manager.io/inject-ca-from: default/kargo-webhooks-server
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role-binding.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role-binding.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role-binding.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role-binding.yaml	2024-12-06 19:13:12.808887823 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-webhooks-server
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -25,12 +25,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-webhooks-server-ns-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -46,12 +46,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-webhooks-server-generic-gc
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role.yaml	2024-12-06 19:13:12.804887824 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-webhooks-server
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 rules:
 - apiGroups:
@@ -79,12 +79,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-webhooks-server-ns-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 rules:
 - apiGroups:
@@ -105,12 +105,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-webhooks-server-generic-gc
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/configmap.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/configmap.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/configmap.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/configmap.yaml	2024-12-06 19:13:12.804887824 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-webhooks-server
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 data:
   KARGO_NAMESPACE: default
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/deployment.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/deployment.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/deployment.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/deployment.yaml	2024-12-06 19:13:12.808887823 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-webhooks-server
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 spec:
   replicas: 1
@@ -23,23 +23,35 @@
       app.kubernetes.io/component: webhooks-server
   template:
     metadata:
       labels:
-        helm.sh/chart: kargo-1.0.3
+        helm.sh/chart: kargo-1.1.0
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
-        app.kubernetes.io/version: "v1.0.3"
+        app.kubernetes.io/version: "v1.1.0"
         app.kubernetes.io/managed-by: Helm
         app.kubernetes.io/component: webhooks-server
       annotations:
         configmap/checksum: 517e77c4dd49419d768a458d24a72e747c19a23a0eb5f022b3fe25fd49dd5a7c
     spec:
       serviceAccount: kargo-webhooks-server
       containers:
       - name: webhooks-server
-        image: ghcr.io/akuity/kargo:v1.0.3
+        image: ghcr.io/akuity/kargo:v1.1.0
         imagePullPolicy: IfNotPresent
-        command: ["/usr/local/bin/kargo", "webhooks-server"]
+        command: ["/sbin/tini", "--", "/usr/local/bin/kargo"]
+        args: ["webhooks-server"]
+        env:
+        - name: GOMEMLIMIT
+          valueFrom:
+            resourceFieldRef:
+              containerName: webhooks-server
+              resource: limits.memory
+        - name: GOMAXPROCS
+          valueFrom:
+            resourceFieldRef:
+              containerName: webhooks-server
+              resource: limits.cpu
         envFrom:
         - configMapRef:
             name: kargo-webhooks-server
         ports:
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service-account.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service-account.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service-account.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service-account.yaml	2024-12-06 19:13:12.804887824 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-webhooks-server
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service.yaml	2024-12-06 19:13:47.200887107 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service.yaml	2024-12-06 19:13:12.808887823 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-webhooks-server
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 spec:
   type: ClusterIP
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/cluster-role-binding.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/cluster-role-binding.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/cluster-role-binding.yaml	2024-12-06 19:13:47.020887165 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/cluster-role-binding.yaml	2024-12-06 19:13:12.628887883 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-api
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -25,12 +25,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-api-rollouts
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/cluster-role.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/cluster-role.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/cluster-role.yaml	2024-12-06 19:13:47.020887165 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/cluster-role.yaml	2024-12-06 19:13:12.628887883 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-api
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 rules:
   - apiGroups:
@@ -129,12 +129,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-project-admin
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 rules:
 - apiGroups:
@@ -158,12 +158,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-api-rollouts
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/configmap.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/configmap.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/configmap.yaml	2024-12-06 19:13:47.020887165 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/configmap.yaml	2024-12-06 19:13:12.628887883 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 data:
   KARGO_NAMESPACE: default
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/deployment.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/deployment.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/deployment.yaml	2024-12-06 19:13:47.020887165 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/deployment.yaml	2024-12-06 19:13:12.628887883 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 spec:
   replicas: 1
@@ -23,12 +23,12 @@
       app.kubernetes.io/component: api
   template:
     metadata:
       labels:
-        helm.sh/chart: kargo-1.0.3
+        helm.sh/chart: kargo-1.1.0
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
-        app.kubernetes.io/version: "v1.0.3"
+        app.kubernetes.io/version: "v1.1.0"
         app.kubernetes.io/managed-by: Helm
         app.kubernetes.io/component: api
       annotations:
         configmap/checksum: 6aa8d2b5c0777debaaf7638d702c68a2a4d5ebbe594cf72cb73dca90ec719176
@@ -36,11 +36,22 @@
     spec:
       serviceAccount: kargo-api
       containers:
         - name: api
-          image: ghcr.io/akuity/kargo:v1.0.3
+          image: ghcr.io/akuity/kargo:v1.1.0
           imagePullPolicy: IfNotPresent
           command: ["/usr/local/bin/kargo", "api"]
+          env:
+          - name: GOMEMLIMIT
+            valueFrom:
+              resourceFieldRef:
+                containerName: api
+                resource: limits.memory
+          - name: GOMAXPROCS
+            valueFrom:
+              resourceFieldRef:
+                containerName: api
+                resource: limits.cpu
           envFrom:
           - configMapRef:
               name: kargo-api
           - secretRef:
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/ingress.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/ingress.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/ingress.yaml	2024-12-06 19:13:47.024887163 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/ingress.yaml	2024-12-06 19:13:12.628887883 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
   annotations:
     cert-manager.io/cluster-issuer: "letsencrypt-staging"
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/secret.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/secret.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/secret.yaml	2024-12-06 19:13:47.020887165 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/secret.yaml	2024-12-06 19:13:12.624887885 +0000
@@ -6,12 +6,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 stringData:  
   ADMIN_ACCOUNT_PASSWORD_HASH: "$2y$10$7FtRo..bKM5qcrp8dv.7f.TDAQLRSge47Dpi8sLM4sWbWqd9kQAha"  
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/service-account.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/service-account.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/service-account.yaml	2024-12-06 19:13:47.020887165 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/service-account.yaml	2024-12-06 19:13:12.624887885 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/service.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/service.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/service.yaml	2024-12-06 19:13:47.020887165 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/service.yaml	2024-12-06 19:13:12.628887883 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 spec:
   type: ClusterIP
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/cluster-role-bindings.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/cluster-role-bindings.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/cluster-role-bindings.yaml	2024-12-06 19:13:47.020887165 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/cluster-role-bindings.yaml	2024-12-06 19:13:12.628887883 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -25,12 +25,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-controller-argocd
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -46,12 +46,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-controller-rollouts
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/cluster-roles.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/cluster-roles.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/cluster-roles.yaml	2024-12-06 19:13:47.020887165 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/cluster-roles.yaml	2024-12-06 19:13:12.628887883 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 rules:
 - apiGroups:
@@ -71,12 +71,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-controller-read-secrets
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 rules:
 - apiGroups:
@@ -93,12 +93,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-controller-argocd
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 rules:
 - apiGroups:
@@ -116,12 +116,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-controller-rollouts
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/configmap.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/configmap.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/configmap.yaml	2024-12-06 19:13:47.020887165 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/configmap.yaml	2024-12-06 19:13:12.628887883 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 data:
   API_SERVER_BASE_URL: https://kargo-metalstack.platform-engineer.cloud
@@ -23,4 +23,8 @@
   ARGOCD_NAMESPACE: argocd
   ARGOCD_WATCH_ARGOCD_NAMESPACE_ONLY: "false"
   ROLLOUTS_INTEGRATION_ENABLED: "true"
   ROLLOUTS_CONTROLLER_INSTANCE_ID: ""
+  MAX_CONCURRENT_CONTROL_FLOW_RECONCILES: "4"
+  MAX_CONCURRENT_PROMOTION_RECONCILES: "4"
+  MAX_CONCURRENT_STAGE_RECONCILES: "4"
+  MAX_CONCURRENT_WAREHOUSE_RECONCILES: "4"
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/deployment.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/deployment.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/deployment.yaml	2024-12-06 19:13:47.020887165 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/deployment.yaml	2024-12-06 19:13:12.628887883 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 spec:
   replicas: 1
@@ -23,23 +23,35 @@
       app.kubernetes.io/component: controller
   template:
     metadata:
       labels:
-        helm.sh/chart: kargo-1.0.3
+        helm.sh/chart: kargo-1.1.0
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
-        app.kubernetes.io/version: "v1.0.3"
+        app.kubernetes.io/version: "v1.1.0"
         app.kubernetes.io/managed-by: Helm
         app.kubernetes.io/component: controller
       annotations:
-        configmap/checksum: d9c19ab0d44a0cdd12dd6a183ecb42af83959e4801c58fb00bf9cd9decb46481
+        configmap/checksum: 64e2f78e50a4bbb4cf7c553e3d4b078e24ef976dce3d291ad1275cd41b91dc3f
     spec:
       serviceAccount: kargo-controller
       containers:
       - name: controller
-        image: ghcr.io/akuity/kargo:v1.0.3
+        image: ghcr.io/akuity/kargo:v1.1.0
         imagePullPolicy: IfNotPresent
-        command: ["/usr/local/bin/kargo", "controller"]
+        command: ["/sbin/tini", "--", "/usr/local/bin/kargo"]
+        args: ["controller"]
+        env:
+        - name: GOMEMLIMIT
+          valueFrom:
+            resourceFieldRef:
+              containerName: controller
+              resource: limits.memory
+        - name: GOMAXPROCS
+          valueFrom:
+            resourceFieldRef:
+              containerName: controller
+              resource: limits.cpu
         envFrom:
         - configMapRef:
             name: kargo-controller
         resources:
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/service-account.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/service-account.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/service-account.yaml	2024-12-06 19:13:47.020887165 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/service-account.yaml	2024-12-06 19:13:12.624887885 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller

Copy link
Contributor

github-actions bot commented Dec 6, 2024

Changes Rendered Chart
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/crds.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/crds.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/crds.yaml	2024-12-06 19:13:47.020887165 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/crds.yaml	2024-12-06 19:13:12.628887883 +0000
@@ -3,9 +3,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: freights.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -205,9 +205,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: projects.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -373,9 +373,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: promotions.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -460,10 +460,58 @@
                     as:
                       description: As is the alias this step can be referred to as.
                       type: string
                     config:
-                      description: Config is the configuration for the directive.
+                      description: |-
+                        Config is opaque configuration for the PromotionStep that is understood
+                        only by each PromotionStep's implementation. It is legal to utilize
+                        expressions in defining values at any level of this block.
+                        See https://docs.kargo.io/references/expression-language for details.
                       x-kubernetes-preserve-unknown-fields: true
+                    retry:
+                      description: Retry is the retry policy for this step.
+                      properties:
+                        errorThreshold:
+                          description: |-
+                            ErrorThreshold is the number of consecutive times the step must fail (for
+                            any reason) before retries are abandoned and the entire Promotion is marked
+                            as failed.
+
+                            If this field is set to 0, the effective default will be a step-specific
+                            one. If no step-specific default exists (i.e. is also 0), the effective
+                            default will be the system-wide default of 1.
+
+                            A value of 1 will cause the Promotion to be marked as failed after just
+                            a single failure; i.e. no retries will be attempted.
+
+                            There is no option to specify an infinite number of retries using a value
+                            such as -1.
+
+                            In a future release, Kargo is likely to become capable of distinguishing
+                            between recoverable and non-recoverable step failures. At that time, it is
+                            planned that unrecoverable failures will not be subject to this threshold
+                            and will immediately cause the Promotion to be marked as failed without
+                            further condition.
+                          format: int32
+                          type: integer
+                        timeout:
+                          description: |-
+                            Timeout is the soft maximum interval in which a step that returns a Running
+                            status (which typically indicates it's waiting for something to happen)
+                            may be retried.
+
+                            The maximum is a soft one because the check for whether the interval has
+                            elapsed occurs AFTER the step has run. This effectively means a step may
+                            run ONCE beyond the close of the interval.
+
+                            If this field is set to nil, the effective default will be a step-specific
+                            one. If no step-specific default exists (i.e. is also nil), the effective
+                            default will be the system-wide default of 0.
+
+                            A value of 0 will cause the step to be retried indefinitely unless the
+                            ErrorThreshold is reached.
+                          type: string
+                      type: object
                     uses:
                       description: Uses identifies a runner that can execute this
                         step.
                       minLength: 1
@@ -471,8 +519,33 @@
                   required:
                   - uses
                   type: object
                 type: array
+              vars:
+                description: |-
+                  Vars is a list of variables that can be referenced by expressions in
+                  promotion steps.
+                items:
+                  description: |-
+                    PromotionVariable describes a single variable that may be referenced by
+                    expressions in promotion steps.
+                  properties:
+                    name:
+                      description: Name is the name of the variable.
+                      minLength: 1
+                      pattern: ^[a-zA-Z_]\w*$
+                      type: string
+                    value:
+                      description: |-
+                        Value is the value of the variable. It is allowed to utilize expressions
+                        in the value.
+                        See https://docs.kargo.io/references/expression-language for details.
+                      type: string
+                  required:
+                  - name
+                  - value
+                  type: object
+                type: array
             required:
             - freight
             - stage
             type: object
@@ -857,8 +930,46 @@
                 description: |-
                   State stores the state of the promotion process between reconciliation
                   attempts.
                 x-kubernetes-preserve-unknown-fields: true
+              stepExecutionMetadata:
+                description: |-
+                  StepExecutionMetadata tracks metadata pertaining to the execution
+                  of individual promotion steps.
+                items:
+                  description: |-
+                    StepExecutionMetadata tracks metadata pertaining to the execution of
+                    a promotion step.
+                  properties:
+                    alias:
+                      description: Alias is the alias of the step.
+                      type: string
+                    errorCount:
+                      description: ErrorCount tracks consecutive failed attempts to
+                        execute the step.
+                      format: int32
+                      type: integer
+                    finishedAt:
+                      description: |-
+                        FinishedAt is the time at which the final attempt to execute the step
+                        completed.
+                      format: date-time
+                      type: string
+                    message:
+                      description: Message is a display message about the step, including
+                        any errors.
+                      type: string
+                    startedAt:
+                      description: |-
+                        StartedAt is the time at which the first attempt to execute the step
+                        began.
+                      format: date-time
+                      type: string
+                    status:
+                      description: Status is the high-level outcome of the step.
+                      type: string
+                  type: object
+                type: array
             type: object
         required:
         - spec
         type: object
@@ -871,9 +982,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: stages.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -951,10 +1062,58 @@
                               description: As is the alias this step can be referred
                                 to as.
                               type: string
                             config:
-                              description: Config is the configuration for the directive.
+                              description: |-
+                                Config is opaque configuration for the PromotionStep that is understood
+                                only by each PromotionStep's implementation. It is legal to utilize
+                                expressions in defining values at any level of this block.
+                                See https://docs.kargo.io/references/expression-language for details.
                               x-kubernetes-preserve-unknown-fields: true
+                            retry:
+                              description: Retry is the retry policy for this step.
+                              properties:
+                                errorThreshold:
+                                  description: |-
+                                    ErrorThreshold is the number of consecutive times the step must fail (for
+                                    any reason) before retries are abandoned and the entire Promotion is marked
+                                    as failed.
+
+                                    If this field is set to 0, the effective default will be a step-specific
+                                    one. If no step-specific default exists (i.e. is also 0), the effective
+                                    default will be the system-wide default of 1.
+
+                                    A value of 1 will cause the Promotion to be marked as failed after just
+                                    a single failure; i.e. no retries will be attempted.
+
+                                    There is no option to specify an infinite number of retries using a value
+                                    such as -1.
+
+                                    In a future release, Kargo is likely to become capable of distinguishing
+                                    between recoverable and non-recoverable step failures. At that time, it is
+                                    planned that unrecoverable failures will not be subject to this threshold
+                                    and will immediately cause the Promotion to be marked as failed without
+                                    further condition.
+                                  format: int32
+                                  type: integer
+                                timeout:
+                                  description: |-
+                                    Timeout is the soft maximum interval in which a step that returns a Running
+                                    status (which typically indicates it's waiting for something to happen)
+                                    may be retried.
+
+                                    The maximum is a soft one because the check for whether the interval has
+                                    elapsed occurs AFTER the step has run. This effectively means a step may
+                                    run ONCE beyond the close of the interval.
+
+                                    If this field is set to nil, the effective default will be a step-specific
+                                    one. If no step-specific default exists (i.e. is also nil), the effective
+                                    default will be the system-wide default of 0.
+
+                                    A value of 0 will cause the step to be retried indefinitely unless the
+                                    ErrorThreshold is reached.
+                                  type: string
+                              type: object
                             uses:
                               description: Uses identifies a runner that can execute
                                 this step.
                               minLength: 1
@@ -963,8 +1122,33 @@
                           - uses
                           type: object
                         minItems: 1
                         type: array
+                      vars:
+                        description: |-
+                          Vars is a list of variables that can be referenced by expressions in
+                          promotion steps.
+                        items:
+                          description: |-
+                            PromotionVariable describes a single variable that may be referenced by
+                            expressions in promotion steps.
+                          properties:
+                            name:
+                              description: Name is the name of the variable.
+                              minLength: 1
+                              pattern: ^[a-zA-Z_]\w*$
+                              type: string
+                            value:
+                              description: |-
+                                Value is the value of the variable. It is allowed to utilize expressions
+                                in the value.
+                                See https://docs.kargo.io/references/expression-language for details.
+                              type: string
+                          required:
+                          - name
+                          - value
+                          type: object
+                        type: array
                     type: object
                 required:
                 - spec
                 type: object
@@ -1104,8 +1288,70 @@
           status:
             description: Status describes the Stage's current and recent Freight,
               health, and more.
             properties:
+              conditions:
+                description: |-
+                  Conditions contains the last observations of the Stage's current
+                  state.
+                items:
+                  description: Condition contains details for one aspect of the current
+                    state of this API Resource.
+                  properties:
+                    lastTransitionTime:
+                      description: |-
+                        lastTransitionTime is the last time the condition transitioned from one status to another.
+                        This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.
+                      format: date-time
+                      type: string
+                    message:
+                      description: |-
+                        message is a human readable message indicating details about the transition.
+                        This may be an empty string.
+                      maxLength: 32768
+                      type: string
+                    observedGeneration:
+                      description: |-
+                        observedGeneration represents the .metadata.generation that the condition was set based upon.
+                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date
+                        with respect to the current state of the instance.
+                      format: int64
+                      minimum: 0
+                      type: integer
+                    reason:
+                      description: |-
+                        reason contains a programmatic identifier indicating the reason for the condition's last transition.
+                        Producers of specific condition types may define expected values and meanings for this field,
+                        and whether the values are considered a guaranteed API.
+                        The value should be a CamelCase string.
+                        This field may not be empty.
+                      maxLength: 1024
+                      minLength: 1
+                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
+                      type: string
+                    status:
+                      description: status of the condition, one of True, False, Unknown.
+                      enum:
+                      - "True"
+                      - "False"
+                      - Unknown
+                      type: string
+                    type:
+                      description: type of condition in CamelCase or in foo.example.com/CamelCase.
+                      maxLength: 316
+                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
+                      type: string
+                  required:
+                  - lastTransitionTime
+                  - message
+                  - reason
+                  - status
+                  - type
+                  type: object
+                type: array
+                x-kubernetes-list-map-keys:
+                - type
+                x-kubernetes-list-type: map
               currentPromotion:
                 description: CurrentPromotion is a reference to the currently Running
                   promotion.
                 properties:
@@ -1625,8 +1871,47 @@
                         description: |-
                           State stores the state of the promotion process between reconciliation
                           attempts.
                         x-kubernetes-preserve-unknown-fields: true
+                      stepExecutionMetadata:
+                        description: |-
+                          StepExecutionMetadata tracks metadata pertaining to the execution
+                          of individual promotion steps.
+                        items:
+                          description: |-
+                            StepExecutionMetadata tracks metadata pertaining to the execution of
+                            a promotion step.
+                          properties:
+                            alias:
+                              description: Alias is the alias of the step.
+                              type: string
+                            errorCount:
+                              description: ErrorCount tracks consecutive failed attempts
+                                to execute the step.
+                              format: int32
+                              type: integer
+                            finishedAt:
+                              description: |-
+                                FinishedAt is the time at which the final attempt to execute the step
+                                completed.
+                              format: date-time
+                              type: string
+                            message:
+                              description: Message is a display message about the
+                                step, including any errors.
+                              type: string
+                            startedAt:
+                              description: |-
+                                StartedAt is the time at which the first attempt to execute the step
+                                began.
+                              format: date-time
+                              type: string
+                            status:
+                              description: Status is the high-level outcome of the
+                                step.
+                              type: string
+                          type: object
+                        type: array
                     type: object
                 required:
                 - name
                 type: object
@@ -1857,51 +2142,8 @@
                 type: string
               health:
                 description: Health is the Stage's last observed health.
                 properties:
-                  argoCDApps:
-                    description: ArgoCDApps describes the current state of any related
-                      ArgoCD Applications.
-                    items:
-                      description: ArgoCDAppStatus describes the current state of
-                        a single ArgoCD Application.
-                      properties:
-                        healthStatus:
-                          description: HealthStatus is the health of the ArgoCD Application.
-                          properties:
-                            message:
-                              type: string
-                            status:
-                              type: string
-                          required:
-                          - status
-                          type: object
-                        name:
-                          description: Name is the name of the ArgoCD Application.
-                          type: string
-                        namespace:
-                          description: Namespace is the namespace of the ArgoCD Application.
-                          type: string
-                        syncStatus:
-                          description: SyncStatus is the sync status of the ArgoCD
-                            Application.
-                          properties:
-                            revision:
-                              type: string
-                            revisions:
-                              items:
-                                type: string
-                              type: array
-                            status:
-                              type: string
-                          required:
-                          - status
-                          type: object
-                      required:
-                      - name
-                      - namespace
-                      type: object
-                    type: array
                   config:
                     description: |-
                       Config is the opaque configuration of all health checks performed on this
                       Stage.
@@ -2446,8 +2688,47 @@
                         description: |-
                           State stores the state of the promotion process between reconciliation
                           attempts.
                         x-kubernetes-preserve-unknown-fields: true
+                      stepExecutionMetadata:
+                        description: |-
+                          StepExecutionMetadata tracks metadata pertaining to the execution
+                          of individual promotion steps.
+                        items:
+                          description: |-
+                            StepExecutionMetadata tracks metadata pertaining to the execution of
+                            a promotion step.
+                          properties:
+                            alias:
+                              description: Alias is the alias of the step.
+                              type: string
+                            errorCount:
+                              description: ErrorCount tracks consecutive failed attempts
+                                to execute the step.
+                              format: int32
+                              type: integer
+                            finishedAt:
+                              description: |-
+                                FinishedAt is the time at which the final attempt to execute the step
+                                completed.
+                              format: date-time
+                              type: string
+                            message:
+                              description: Message is a display message about the
+                                step, including any errors.
+                              type: string
+                            startedAt:
+                              description: |-
+                                StartedAt is the time at which the first attempt to execute the step
+                                began.
+                              format: date-time
+                              type: string
+                            status:
+                              description: Status is the high-level outcome of the
+                                step.
+                              type: string
+                          type: object
+                        type: array
                     type: object
                 required:
                 - name
                 type: object
@@ -2478,9 +2759,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: warehouses.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -2528,8 +2809,9 @@
                 description: |-
                   FreightCreationPolicy describes how Freight is created by this Warehouse.
                   This field is optional. When left unspecified, the field is implicitly
                   treated as if its value were "Automatic".
+                  Accepted values: Automatic, Manual
                 enum:
                 - Automatic
                 - Manual
                 type: string
@@ -2637,8 +2919,9 @@
                             CommitSelectionStrategy specifies the rules for how to identify the newest
                             commit of interest in the repository specified by the RepoURL field. This
                             field is optional. When left unspecified, the field is implicitly treated
                             as if its value were "NewestFromBranch".
+                            Accepted values: Lexical, NewestFromBranch, NewestTag, SemVer
                           enum:
                           - Lexical
                           - NewestFromBranch
                           - NewestTag
@@ -2782,8 +3065,9 @@
                             ImageSelectionStrategy specifies the rules for how to identify the newest version
                             of the image specified by the RepoURL field. This field is optional. When
                             left unspecified, the field is implicitly treated as if its value were
                             "SemVer".
+                            Accepted values: Digest, Lexical, NewestBuild, SemVer
                           enum:
                           - Digest
                           - Lexical
                           - NewestBuild
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-role-bindings.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-role-bindings.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-role-bindings.yaml	2024-12-06 19:13:47.020887165 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-role-bindings.yaml	2024-12-06 19:13:12.628887883 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-garbage-collector
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-roles.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-roles.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-roles.yaml	2024-12-06 19:13:47.020887165 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-roles.yaml	2024-12-06 19:13:12.628887883 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-garbage-collector
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/configmap.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/configmap.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/configmap.yaml	2024-12-06 19:13:47.020887165 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/configmap.yaml	2024-12-06 19:13:12.628887883 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-garbage-collector
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
 data:
   LOG_LEVEL: "INFO"
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cron-job.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cron-job.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cron-job.yaml	2024-12-06 19:13:47.024887163 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cron-job.yaml	2024-12-06 19:13:12.628887883 +0000
@@ -5,47 +5,59 @@
 metadata:
   name: kargo-garbage-collector
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
 spec:
   schedule: "0 * * * *"
   concurrencyPolicy: Forbid
   jobTemplate:
     metadata:
       labels:
-        helm.sh/chart: kargo-1.0.3
+        helm.sh/chart: kargo-1.1.0
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
-        app.kubernetes.io/version: "v1.0.3"
+        app.kubernetes.io/version: "v1.1.0"
         app.kubernetes.io/managed-by: Helm
         app.kubernetes.io/component: garbage-collector
       annotations:
         configmap/checksum: a825d50984da3ea04b6adc3590a6a9e0490ba058c6a59506bd0620bc09b1dc74
     spec:
       template:
         metadata:
           labels:
-            helm.sh/chart: kargo-1.0.3
+            helm.sh/chart: kargo-1.1.0
             app.kubernetes.io/name: kargo
             app.kubernetes.io/instance: release-name
-            app.kubernetes.io/version: "v1.0.3"
+            app.kubernetes.io/version: "v1.1.0"
             app.kubernetes.io/managed-by: Helm
             app.kubernetes.io/component: garbage-collector
           annotations:
             configmap/checksum: a825d50984da3ea04b6adc3590a6a9e0490ba058c6a59506bd0620bc09b1dc74
         spec:
           serviceAccountName: kargo-garbage-collector
           containers:
           - name: garbage-collector
-            image: ghcr.io/akuity/kargo:v1.0.3
+            image: ghcr.io/akuity/kargo:v1.1.0
             imagePullPolicy: IfNotPresent
-            command: ["/usr/local/bin/kargo", "garbage-collector"]
+            command: ["/sbin/tini", "--", "/usr/local/bin/kargo"]
+            args: ["garbage-collector"]
+            env:
+            - name: GOMEMLIMIT
+              valueFrom:
+                resourceFieldRef:
+                  containerName: garbage-collector
+                  resource: limits.memory
+            - name: GOMAXPROCS
+              valueFrom:
+                resourceFieldRef:
+                  containerName: garbage-collector
+                  resource: limits.cpu
             envFrom:
             - configMapRef:
                 name: kargo-garbage-collector
             resources:
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/service-account.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/service-account.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/service-account.yaml	2024-12-06 19:13:47.020887165 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/service-account.yaml	2024-12-06 19:13:12.624887885 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-garbage-collector
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-role-bindings.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-role-bindings.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-role-bindings.yaml	2024-12-06 19:13:47.020887165 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-role-bindings.yaml	2024-12-06 19:13:12.628887883 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-management-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-roles.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-roles.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-roles.yaml	2024-12-06 19:13:47.020887165 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-roles.yaml	2024-12-06 19:13:12.628887883 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-management-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/configmap.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/configmap.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/configmap.yaml	2024-12-06 19:13:47.020887165 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/configmap.yaml	2024-12-06 19:13:12.628887883 +0000
@@ -5,13 +5,16 @@
 metadata:
   name: kargo-management-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
 data:
   KARGO_NAMESPACE: default
   LOG_LEVEL: "INFO"
+  MAX_CONCURRENT_NAMESPACE_RECONCILES: "4"
+  MAX_CONCURRENT_PROJECT_RECONCILES: "4"
+  MAX_CONCURRENT_SERVICE_ACCOUNT_RECONCILES: "4"
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/deployment.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/deployment.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/deployment.yaml	2024-12-06 19:13:47.020887165 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/deployment.yaml	2024-12-06 19:13:12.628887883 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-management-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
 spec:
   replicas: 1
@@ -27,16 +27,28 @@
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
         app.kubernetes.io/component: management-controller
       annotations:
-        configmap/checksum: f12f16e41a5ad2eafe250dc88ee5bbb12da69eef9a24cdd7fe31d77b4af02ef0
+        configmap/checksum: bcf468b0c814c0cda7c1733b1393de92d5d51cfc38ed6b66c2891b895d9071ff
     spec:
       serviceAccount: kargo-management-controller
       containers:
       - name: management-controller
-        image: ghcr.io/akuity/kargo:v1.0.3
+        image: ghcr.io/akuity/kargo:v1.1.0
         imagePullPolicy: IfNotPresent
-        command: ["/usr/local/bin/kargo", "management-controller"]
+        command: ["/sbin/tini", "--", "/usr/local/bin/kargo"]
+        args: ["management-controller"]
+        env:
+        - name: GOMEMLIMIT
+          valueFrom:
+            resourceFieldRef:
+              containerName: management-controller
+              resource: limits.memory
+        - name: GOMAXPROCS
+          valueFrom:
+            resourceFieldRef:
+              containerName: management-controller
+              resource: limits.cpu
         envFrom:
         - configMapRef:
             name: kargo-management-controller
         resources:
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/service-account.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/service-account.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/service-account.yaml	2024-12-06 19:13:47.020887165 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/service-account.yaml	2024-12-06 19:13:12.624887885 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-management-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/users/cluster-role-bindings.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/users/cluster-role-bindings.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/users/cluster-role-bindings.yaml	2024-12-06 19:13:47.020887165 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/users/cluster-role-bindings.yaml	2024-12-06 19:13:12.628887883 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-admin
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
@@ -24,12 +24,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-viewer
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/users/cluster-roles.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/users/cluster-roles.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/users/cluster-roles.yaml	2024-12-06 19:13:47.020887165 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/users/cluster-roles.yaml	2024-12-06 19:13:12.628887883 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-admin
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
 rules:
 - apiGroups:
   - ""
@@ -84,12 +84,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-viewer
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
 rules:
 - apiGroups:
   - ""
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/users/service-accounts.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/users/service-accounts.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/users/service-accounts.yaml	2024-12-06 19:13:47.020887165 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/users/service-accounts.yaml	2024-12-06 19:13:12.624887885 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-admin
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
 ---
 # Source: sx-kargo/charts/kargo/templates/users/service-accounts.yaml
 apiVersion: v1
@@ -18,9 +18,9 @@
 metadata:
   name: kargo-viewer
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks/webhooks.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks/webhooks.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks/webhooks.yaml	2024-12-06 19:13:47.024887163 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks/webhooks.yaml	2024-12-06 19:13:12.628887883 +0000
@@ -4,12 +4,12 @@
 kind: MutatingWebhookConfiguration
 metadata:
   name: kargo
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
   annotations:
     cert-manager.io/inject-ca-from: default/kargo-webhooks-server
@@ -80,12 +80,12 @@
 kind: ValidatingWebhookConfiguration
 metadata:
   name: kargo
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
   annotations:
     cert-manager.io/inject-ca-from: default/kargo-webhooks-server
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role-binding.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role-binding.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role-binding.yaml	2024-12-06 19:13:47.020887165 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role-binding.yaml	2024-12-06 19:13:12.628887883 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-webhooks-server
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -25,12 +25,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-webhooks-server-ns-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -46,12 +46,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-webhooks-server-generic-gc
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role.yaml	2024-12-06 19:13:47.020887165 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role.yaml	2024-12-06 19:13:12.628887883 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-webhooks-server
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 rules:
 - apiGroups:
@@ -79,12 +79,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-webhooks-server-ns-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 rules:
 - apiGroups:
@@ -105,12 +105,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-webhooks-server-generic-gc
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/configmap.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/configmap.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/configmap.yaml	2024-12-06 19:13:47.020887165 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/configmap.yaml	2024-12-06 19:13:12.628887883 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-webhooks-server
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 data:
   KARGO_NAMESPACE: default
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/deployment.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/deployment.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/deployment.yaml	2024-12-06 19:13:47.020887165 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/deployment.yaml	2024-12-06 19:13:12.628887883 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-webhooks-server
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.0
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.0"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 spec:
   replicas: 1
@@ -23,23 +23,35 @@
       app.kubernetes.io/component: webhooks-server
   template:
     metadata:
       labels:
-        helm.sh/chart: kargo-1.0.3
+        helm.sh/chart: kargo-1.1.0
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
-        app.kubernetes.io/version: "v1.0.3"
+        app.kubernetes.io/version: "v1.1.0"
         app.kubernetes.io/managed-by: Helm
         app.kubernetes.io/component: webhooks-server
       annotations:
         configmap/checksum: 517e77c4dd49419d768a458d24a72e747c19a23a0eb5f022b3fe25fd49dd5a7c
     spec:
       serviceAccount: kargo-webhooks-server
       containers:
       - name: webhooks-server
-        image: ghcr.io/akuity/kargo:v1.0.3
+        image: ghcr.io/akuity/kargo:v1.1.0
         imagePullPolicy: IfNotPresent
-        command: ["/usr/local/bin/kargo", "webhooks-server"]
+        command: ["/sbin/tini", "--", "/usr/local/bin/kargo"]
+        args: ["webhooks-server"]
+        env:
+        - name: GOMEMLIMIT
+          valueFrom:
+            resourceFieldRef:
+              containerName: webhooks-server
+              resource: limits.memory
+        - name: GOMAXPROCS
+          valueFrom:
+            resourceFieldRef:
+              containerName: webhooks-server
+              resource: limits.cpu
         envFrom:
         - configMapRef:
             name: kargo-webhooks-server
         ports:

@renovate renovate bot changed the title chore(deps): update kargo docker tag to v1.1.0 chore(deps): update kargo docker tag to v1.1.1 Dec 9, 2024
@renovate renovate bot force-pushed the renovate/kargo-1.x branch from 59bf769 to 59b74c5 Compare December 9, 2024 23:43
Copy link
Contributor

github-actions bot commented Dec 9, 2024

Changes Rendered Chart
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/cluster-role-binding.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/cluster-role-binding.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/cluster-role-binding.yaml	2024-12-09 23:44:45.303276278 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/cluster-role-binding.yaml	2024-12-09 23:44:17.518163067 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-api
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -25,12 +25,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-api-rollouts
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/cluster-role.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/cluster-role.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/cluster-role.yaml	2024-12-09 23:44:45.302276275 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/cluster-role.yaml	2024-12-09 23:44:17.518163067 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-api
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 rules:
   - apiGroups:
@@ -129,12 +129,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-project-admin
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 rules:
 - apiGroups:
@@ -158,12 +158,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-api-rollouts
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/configmap.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/configmap.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/configmap.yaml	2024-12-09 23:44:45.302276275 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/configmap.yaml	2024-12-09 23:44:17.517163063 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 data:
   KARGO_NAMESPACE: default
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/deployment.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/deployment.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/deployment.yaml	2024-12-09 23:44:45.304276281 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/deployment.yaml	2024-12-09 23:44:17.519163071 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 spec:
   replicas: 1
@@ -23,12 +23,12 @@
       app.kubernetes.io/component: api
   template:
     metadata:
       labels:
-        helm.sh/chart: kargo-1.0.3
+        helm.sh/chart: kargo-1.1.1
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
-        app.kubernetes.io/version: "v1.0.3"
+        app.kubernetes.io/version: "v1.1.1"
         app.kubernetes.io/managed-by: Helm
         app.kubernetes.io/component: api
       annotations:
         configmap/checksum: 23e23fcd98e89d6de26a59efb1ce09ebc45ed7438e0dad6c06ce251f738e491b
@@ -36,11 +36,22 @@
     spec:
       serviceAccount: kargo-api
       containers:
         - name: api
-          image: ghcr.io/akuity/kargo:v1.0.3
+          image: ghcr.io/akuity/kargo:v1.1.1
           imagePullPolicy: IfNotPresent
           command: ["/usr/local/bin/kargo", "api"]
+          env:
+          - name: GOMEMLIMIT
+            valueFrom:
+              resourceFieldRef:
+                containerName: api
+                resource: limits.memory
+          - name: GOMAXPROCS
+            valueFrom:
+              resourceFieldRef:
+                containerName: api
+                resource: limits.cpu
           envFrom:
           - configMapRef:
               name: kargo-api
           - secretRef:
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/ingress.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/ingress.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/ingress.yaml	2024-12-09 23:44:45.304276281 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/ingress.yaml	2024-12-09 23:44:17.519163071 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
   annotations:
     cert-manager.io/cluster-issuer: "letsencrypt-prod"
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/secret.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/secret.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/secret.yaml	2024-12-09 23:44:45.302276275 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/secret.yaml	2024-12-09 23:44:17.517163063 +0000
@@ -6,12 +6,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 stringData:  
   ADMIN_ACCOUNT_PASSWORD_HASH: "$2y$10$7FtRo..bKM5qcrp8dv.7f.TDAQLRSge47Dpi8sLM4sWbWqd9kQAha"  
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/service-account.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/service-account.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/service-account.yaml	2024-12-09 23:44:45.301276272 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/service-account.yaml	2024-12-09 23:44:17.517163063 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/service.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/service.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/service.yaml	2024-12-09 23:44:45.304276281 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/api/service.yaml	2024-12-09 23:44:17.519163071 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 spec:
   type: ClusterIP
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/cluster-role-bindings.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/cluster-role-bindings.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/cluster-role-bindings.yaml	2024-12-09 23:44:45.303276278 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/cluster-role-bindings.yaml	2024-12-09 23:44:17.518163067 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -25,12 +25,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-controller-argocd
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -46,12 +46,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-controller-rollouts
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/cluster-roles.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/cluster-roles.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/cluster-roles.yaml	2024-12-09 23:44:45.303276278 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/cluster-roles.yaml	2024-12-09 23:44:17.518163067 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 rules:
 - apiGroups:
@@ -71,12 +71,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-controller-read-secrets
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 rules:
 - apiGroups:
@@ -93,12 +93,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-controller-argocd
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 rules:
 - apiGroups:
@@ -116,12 +116,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-controller-rollouts
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/configmap.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/configmap.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/configmap.yaml	2024-12-09 23:44:45.302276275 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/configmap.yaml	2024-12-09 23:44:17.517163063 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 data:
   API_SERVER_BASE_URL: https://kargo.demo.kubrix.cloud
@@ -23,4 +23,8 @@
   ARGOCD_NAMESPACE: argocd
   ARGOCD_WATCH_ARGOCD_NAMESPACE_ONLY: "false"
   ROLLOUTS_INTEGRATION_ENABLED: "true"
   ROLLOUTS_CONTROLLER_INSTANCE_ID: ""
+  MAX_CONCURRENT_CONTROL_FLOW_RECONCILES: "4"
+  MAX_CONCURRENT_PROMOTION_RECONCILES: "4"
+  MAX_CONCURRENT_STAGE_RECONCILES: "4"
+  MAX_CONCURRENT_WAREHOUSE_RECONCILES: "4"
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service-account.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service-account.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service-account.yaml	2024-12-09 23:44:45.475276799 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service-account.yaml	2024-12-09 23:44:17.696163808 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-webhooks-server
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service.yaml	2024-12-09 23:44:45.477276805 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service.yaml	2024-12-09 23:44:17.698163817 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-webhooks-server
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 spec:
   type: ClusterIP
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/cluster-role-binding.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/cluster-role-binding.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/cluster-role-binding.yaml	2024-12-09 23:44:45.391276545 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/cluster-role-binding.yaml	2024-12-09 23:44:17.608163442 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-api
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -25,12 +25,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-api-rollouts
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/cluster-role.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/cluster-role.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/cluster-role.yaml	2024-12-09 23:44:45.391276545 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/cluster-role.yaml	2024-12-09 23:44:17.608163442 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-api
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 rules:
   - apiGroups:
@@ -129,12 +129,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-project-admin
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 rules:
 - apiGroups:
@@ -158,12 +158,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-api-rollouts
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/configmap.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/configmap.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/configmap.yaml	2024-12-09 23:44:45.390276542 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/configmap.yaml	2024-12-09 23:44:17.607163438 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 data:
   KARGO_NAMESPACE: default
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/deployment.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/deployment.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/deployment.yaml	2024-12-09 23:44:45.392276548 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/deployment.yaml	2024-12-09 23:44:17.609163446 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 spec:
   replicas: 1
@@ -23,12 +23,12 @@
       app.kubernetes.io/component: api
   template:
     metadata:
       labels:
-        helm.sh/chart: kargo-1.0.3
+        helm.sh/chart: kargo-1.1.1
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
-        app.kubernetes.io/version: "v1.0.3"
+        app.kubernetes.io/version: "v1.1.1"
         app.kubernetes.io/managed-by: Helm
         app.kubernetes.io/component: api
       annotations:
         configmap/checksum: f7f293f570771137759b3d7ce47742b5fa1dcba3b093cad64ec2ba65b8dc7c10
@@ -36,11 +36,22 @@
     spec:
       serviceAccount: kargo-api
       containers:
         - name: api
-          image: ghcr.io/akuity/kargo:v1.0.3
+          image: ghcr.io/akuity/kargo:v1.1.1
           imagePullPolicy: IfNotPresent
           command: ["/usr/local/bin/kargo", "api"]
+          env:
+          - name: GOMEMLIMIT
+            valueFrom:
+              resourceFieldRef:
+                containerName: api
+                resource: limits.memory
+          - name: GOMAXPROCS
+            valueFrom:
+              resourceFieldRef:
+                containerName: api
+                resource: limits.cpu
           envFrom:
           - configMapRef:
               name: kargo-api
           - secretRef:
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/ingress.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/ingress.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/ingress.yaml	2024-12-09 23:44:45.392276548 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/ingress.yaml	2024-12-09 23:44:17.609163446 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
   annotations:
     cert.gardener.cloud/purpose: "managed"
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/secret.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/secret.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/secret.yaml	2024-12-09 23:44:45.390276542 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/secret.yaml	2024-12-09 23:44:17.607163438 +0000
@@ -6,12 +6,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 stringData:  
   ADMIN_ACCOUNT_PASSWORD_HASH: "$2y$10$7FtRo..bKM5qcrp8dv.7f.TDAQLRSge47Dpi8sLM4sWbWqd9kQAha"  
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/service-account.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/service-account.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/service-account.yaml	2024-12-09 23:44:45.390276542 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/service-account.yaml	2024-12-09 23:44:17.607163438 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/service.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/service.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/service.yaml	2024-12-09 23:44:45.392276548 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/api/service.yaml	2024-12-09 23:44:17.609163446 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 spec:
   type: ClusterIP
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/deployment.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/deployment.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/deployment.yaml	2024-12-09 23:44:45.304276281 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/deployment.yaml	2024-12-09 23:44:17.519163071 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 spec:
   replicas: 1
@@ -23,23 +23,35 @@
       app.kubernetes.io/component: controller
   template:
     metadata:
       labels:
-        helm.sh/chart: kargo-1.0.3
+        helm.sh/chart: kargo-1.1.1
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
-        app.kubernetes.io/version: "v1.0.3"
+        app.kubernetes.io/version: "v1.1.1"
         app.kubernetes.io/managed-by: Helm
         app.kubernetes.io/component: controller
       annotations:
-        configmap/checksum: 7cabaa854d19185c6409f4332a705d629e064ad33fc0783b3812dd9cd9ad408c
+        configmap/checksum: c53d7b29f1a07bc575b317d28911d4a1f3a3eeee02873a734065b499a35447da
     spec:
       serviceAccount: kargo-controller
       containers:
       - name: controller
-        image: ghcr.io/akuity/kargo:v1.0.3
+        image: ghcr.io/akuity/kargo:v1.1.1
         imagePullPolicy: IfNotPresent
-        command: ["/usr/local/bin/kargo", "controller"]
+        command: ["/sbin/tini", "--", "/usr/local/bin/kargo"]
+        args: ["controller"]
+        env:
+        - name: GOMEMLIMIT
+          valueFrom:
+            resourceFieldRef:
+              containerName: controller
+              resource: limits.memory
+        - name: GOMAXPROCS
+          valueFrom:
+            resourceFieldRef:
+              containerName: controller
+              resource: limits.cpu
         envFrom:
         - configMapRef:
             name: kargo-controller
         resources:
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/cluster-role-bindings.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/cluster-role-bindings.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/cluster-role-bindings.yaml	2024-12-09 23:44:45.391276545 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/cluster-role-bindings.yaml	2024-12-09 23:44:17.608163442 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -25,12 +25,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-controller-argocd
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -46,12 +46,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-controller-rollouts
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/cluster-roles.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/cluster-roles.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/cluster-roles.yaml	2024-12-09 23:44:45.391276545 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/cluster-roles.yaml	2024-12-09 23:44:17.608163442 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 rules:
 - apiGroups:
@@ -71,12 +71,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-controller-read-secrets
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 rules:
 - apiGroups:
@@ -93,12 +93,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-controller-argocd
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 rules:
 - apiGroups:
@@ -116,12 +116,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-controller-rollouts
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/configmap.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/configmap.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/configmap.yaml	2024-12-09 23:44:45.390276542 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/configmap.yaml	2024-12-09 23:44:17.607163438 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 data:
   API_SERVER_BASE_URL: https://kargo.lab.suxessit.k8s.cloud.uibk.ac.at
@@ -23,4 +23,8 @@
   ARGOCD_NAMESPACE: argocd
   ARGOCD_WATCH_ARGOCD_NAMESPACE_ONLY: "false"
   ROLLOUTS_INTEGRATION_ENABLED: "true"
   ROLLOUTS_CONTROLLER_INSTANCE_ID: ""
+  MAX_CONCURRENT_CONTROL_FLOW_RECONCILES: "4"
+  MAX_CONCURRENT_PROMOTION_RECONCILES: "4"
+  MAX_CONCURRENT_STAGE_RECONCILES: "4"
+  MAX_CONCURRENT_WAREHOUSE_RECONCILES: "4"
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/deployment.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/deployment.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/deployment.yaml	2024-12-09 23:44:45.392276548 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/deployment.yaml	2024-12-09 23:44:17.609163446 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 spec:
   replicas: 1
@@ -23,23 +23,35 @@
       app.kubernetes.io/component: controller
   template:
     metadata:
       labels:
-        helm.sh/chart: kargo-1.0.3
+        helm.sh/chart: kargo-1.1.1
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
-        app.kubernetes.io/version: "v1.0.3"
+        app.kubernetes.io/version: "v1.1.1"
         app.kubernetes.io/managed-by: Helm
         app.kubernetes.io/component: controller
       annotations:
-        configmap/checksum: ddbd5dade03851eb43bd61b1787dbced669b5565d35a410fbaedb83336a3aff6
+        configmap/checksum: bcb880b49320b1182a8b9bae2ffe173ddeb1765410da0e833106254d6c55957d
     spec:
       serviceAccount: kargo-controller
       containers:
       - name: controller
-        image: ghcr.io/akuity/kargo:v1.0.3
+        image: ghcr.io/akuity/kargo:v1.1.1
         imagePullPolicy: IfNotPresent
-        command: ["/usr/local/bin/kargo", "controller"]
+        command: ["/sbin/tini", "--", "/usr/local/bin/kargo"]
+        args: ["controller"]
+        env:
+        - name: GOMEMLIMIT
+          valueFrom:
+            resourceFieldRef:
+              containerName: controller
+              resource: limits.memory
+        - name: GOMAXPROCS
+          valueFrom:
+            resourceFieldRef:
+              containerName: controller
+              resource: limits.cpu
         envFrom:
         - configMapRef:
             name: kargo-controller
         resources:
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/service-account.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/service-account.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/service-account.yaml	2024-12-09 23:44:45.390276542 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/controller/service-account.yaml	2024-12-09 23:44:17.607163438 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/crds.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/crds.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/crds.yaml	2024-12-09 23:44:45.391276545 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/crds.yaml	2024-12-09 23:44:17.608163442 +0000
@@ -3,9 +3,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: freights.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -205,9 +205,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: projects.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -373,9 +373,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: promotions.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -460,10 +460,58 @@
                     as:
                       description: As is the alias this step can be referred to as.
                       type: string
                     config:
-                      description: Config is the configuration for the directive.
+                      description: |-
+                        Config is opaque configuration for the PromotionStep that is understood
+                        only by each PromotionStep's implementation. It is legal to utilize
+                        expressions in defining values at any level of this block.
+                        See https://docs.kargo.io/references/expression-language for details.
                       x-kubernetes-preserve-unknown-fields: true
+                    retry:
+                      description: Retry is the retry policy for this step.
+                      properties:
+                        errorThreshold:
+                          description: |-
+                            ErrorThreshold is the number of consecutive times the step must fail (for
+                            any reason) before retries are abandoned and the entire Promotion is marked
+                            as failed.
+
+                            If this field is set to 0, the effective default will be a step-specific
+                            one. If no step-specific default exists (i.e. is also 0), the effective
+                            default will be the system-wide default of 1.
+
+                            A value of 1 will cause the Promotion to be marked as failed after just
+                            a single failure; i.e. no retries will be attempted.
+
+                            There is no option to specify an infinite number of retries using a value
+                            such as -1.
+
+                            In a future release, Kargo is likely to become capable of distinguishing
+                            between recoverable and non-recoverable step failures. At that time, it is
+                            planned that unrecoverable failures will not be subject to this threshold
+                            and will immediately cause the Promotion to be marked as failed without
+                            further condition.
+                          format: int32
+                          type: integer
+                        timeout:
+                          description: |-
+                            Timeout is the soft maximum interval in which a step that returns a Running
+                            status (which typically indicates it's waiting for something to happen)
+                            may be retried.
+
+                            The maximum is a soft one because the check for whether the interval has
+                            elapsed occurs AFTER the step has run. This effectively means a step may
+                            run ONCE beyond the close of the interval.
+
+                            If this field is set to nil, the effective default will be a step-specific
+                            one. If no step-specific default exists (i.e. is also nil), the effective
+                            default will be the system-wide default of 0.
+
+                            A value of 0 will cause the step to be retried indefinitely unless the
+                            ErrorThreshold is reached.
+                          type: string
+                      type: object
                     uses:
                       description: Uses identifies a runner that can execute this
                         step.
                       minLength: 1
@@ -471,8 +519,33 @@
                   required:
                   - uses
                   type: object
                 type: array
+              vars:
+                description: |-
+                  Vars is a list of variables that can be referenced by expressions in
+                  promotion steps.
+                items:
+                  description: |-
+                    PromotionVariable describes a single variable that may be referenced by
+                    expressions in promotion steps.
+                  properties:
+                    name:
+                      description: Name is the name of the variable.
+                      minLength: 1
+                      pattern: ^[a-zA-Z_]\w*$
+                      type: string
+                    value:
+                      description: |-
+                        Value is the value of the variable. It is allowed to utilize expressions
+                        in the value.
+                        See https://docs.kargo.io/references/expression-language for details.
+                      type: string
+                  required:
+                  - name
+                  - value
+                  type: object
+                type: array
             required:
             - freight
             - stage
             type: object
@@ -857,8 +930,46 @@
                 description: |-
                   State stores the state of the promotion process between reconciliation
                   attempts.
                 x-kubernetes-preserve-unknown-fields: true
+              stepExecutionMetadata:
+                description: |-
+                  StepExecutionMetadata tracks metadata pertaining to the execution
+                  of individual promotion steps.
+                items:
+                  description: |-
+                    StepExecutionMetadata tracks metadata pertaining to the execution of
+                    a promotion step.
+                  properties:
+                    alias:
+                      description: Alias is the alias of the step.
+                      type: string
+                    errorCount:
+                      description: ErrorCount tracks consecutive failed attempts to
+                        execute the step.
+                      format: int32
+                      type: integer
+                    finishedAt:
+                      description: |-
+                        FinishedAt is the time at which the final attempt to execute the step
+                        completed.
+                      format: date-time
+                      type: string
+                    message:
+                      description: Message is a display message about the step, including
+                        any errors.
+                      type: string
+                    startedAt:
+                      description: |-
+                        StartedAt is the time at which the first attempt to execute the step
+                        began.
+                      format: date-time
+                      type: string
+                    status:
+                      description: Status is the high-level outcome of the step.
+                      type: string
+                  type: object
+                type: array
             type: object
         required:
         - spec
         type: object
@@ -871,9 +982,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: stages.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -951,10 +1062,58 @@
                               description: As is the alias this step can be referred
                                 to as.
                               type: string
                             config:
-                              description: Config is the configuration for the directive.
+                              description: |-
+                                Config is opaque configuration for the PromotionStep that is understood
+                                only by each PromotionStep's implementation. It is legal to utilize
+                                expressions in defining values at any level of this block.
+                                See https://docs.kargo.io/references/expression-language for details.
                               x-kubernetes-preserve-unknown-fields: true
+                            retry:
+                              description: Retry is the retry policy for this step.
+                              properties:
+                                errorThreshold:
+                                  description: |-
+                                    ErrorThreshold is the number of consecutive times the step must fail (for
+                                    any reason) before retries are abandoned and the entire Promotion is marked
+                                    as failed.
+
+                                    If this field is set to 0, the effective default will be a step-specific
+                                    one. If no step-specific default exists (i.e. is also 0), the effective
+                                    default will be the system-wide default of 1.
+
+                                    A value of 1 will cause the Promotion to be marked as failed after just
+                                    a single failure; i.e. no retries will be attempted.
+
+                                    There is no option to specify an infinite number of retries using a value
+                                    such as -1.
+
+                                    In a future release, Kargo is likely to become capable of distinguishing
+                                    between recoverable and non-recoverable step failures. At that time, it is
+                                    planned that unrecoverable failures will not be subject to this threshold
+                                    and will immediately cause the Promotion to be marked as failed without
+                                    further condition.
+                                  format: int32
+                                  type: integer
+                                timeout:
+                                  description: |-
+                                    Timeout is the soft maximum interval in which a step that returns a Running
+                                    status (which typically indicates it's waiting for something to happen)
+                                    may be retried.
+
+                                    The maximum is a soft one because the check for whether the interval has
+                                    elapsed occurs AFTER the step has run. This effectively means a step may
+                                    run ONCE beyond the close of the interval.
+
+                                    If this field is set to nil, the effective default will be a step-specific
+                                    one. If no step-specific default exists (i.e. is also nil), the effective
+                                    default will be the system-wide default of 0.
+
+                                    A value of 0 will cause the step to be retried indefinitely unless the
+                                    ErrorThreshold is reached.
+                                  type: string
+                              type: object
                             uses:
                               description: Uses identifies a runner that can execute
                                 this step.
                               minLength: 1
@@ -963,8 +1122,33 @@
                           - uses
                           type: object
                         minItems: 1
                         type: array
+                      vars:
+                        description: |-
+                          Vars is a list of variables that can be referenced by expressions in
+                          promotion steps.
+                        items:
+                          description: |-
+                            PromotionVariable describes a single variable that may be referenced by
+                            expressions in promotion steps.
+                          properties:
+                            name:
+                              description: Name is the name of the variable.
+                              minLength: 1
+                              pattern: ^[a-zA-Z_]\w*$
+                              type: string
+                            value:
+                              description: |-
+                                Value is the value of the variable. It is allowed to utilize expressions
+                                in the value.
+                                See https://docs.kargo.io/references/expression-language for details.
+                              type: string
+                          required:
+                          - name
+                          - value
+                          type: object
+                        type: array
                     type: object
                 required:
                 - spec
                 type: object
@@ -1104,8 +1288,70 @@
           status:
             description: Status describes the Stage's current and recent Freight,
               health, and more.
             properties:
+              conditions:
+                description: |-
+                  Conditions contains the last observations of the Stage's current
+                  state.
+                items:
+                  description: Condition contains details for one aspect of the current
+                    state of this API Resource.
+                  properties:
+                    lastTransitionTime:
+                      description: |-
+                        lastTransitionTime is the last time the condition transitioned from one status to another.
+                        This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.
+                      format: date-time
+                      type: string
+                    message:
+                      description: |-
+                        message is a human readable message indicating details about the transition.
+                        This may be an empty string.
+                      maxLength: 32768
+                      type: string
+                    observedGeneration:
+                      description: |-
+                        observedGeneration represents the .metadata.generation that the condition was set based upon.
+                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date
+                        with respect to the current state of the instance.
+                      format: int64
+                      minimum: 0
+                      type: integer
+                    reason:
+                      description: |-
+                        reason contains a programmatic identifier indicating the reason for the condition's last transition.
+                        Producers of specific condition types may define expected values and meanings for this field,
+                        and whether the values are considered a guaranteed API.
+                        The value should be a CamelCase string.
+                        This field may not be empty.
+                      maxLength: 1024
+                      minLength: 1
+                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
+                      type: string
+                    status:
+                      description: status of the condition, one of True, False, Unknown.
+                      enum:
+                      - "True"
+                      - "False"
+                      - Unknown
+                      type: string
+                    type:
+                      description: type of condition in CamelCase or in foo.example.com/CamelCase.
+                      maxLength: 316
+                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
+                      type: string
+                  required:
+                  - lastTransitionTime
+                  - message
+                  - reason
+                  - status
+                  - type
+                  type: object
+                type: array
+                x-kubernetes-list-map-keys:
+                - type
+                x-kubernetes-list-type: map
               currentPromotion:
                 description: CurrentPromotion is a reference to the currently Running
                   promotion.
                 properties:
@@ -1625,8 +1871,47 @@
                         description: |-
                           State stores the state of the promotion process between reconciliation
                           attempts.
                         x-kubernetes-preserve-unknown-fields: true
+                      stepExecutionMetadata:
+                        description: |-
+                          StepExecutionMetadata tracks metadata pertaining to the execution
+                          of individual promotion steps.
+                        items:
+                          description: |-
+                            StepExecutionMetadata tracks metadata pertaining to the execution of
+                            a promotion step.
+                          properties:
+                            alias:
+                              description: Alias is the alias of the step.
+                              type: string
+                            errorCount:
+                              description: ErrorCount tracks consecutive failed attempts
+                                to execute the step.
+                              format: int32
+                              type: integer
+                            finishedAt:
+                              description: |-
+                                FinishedAt is the time at which the final attempt to execute the step
+                                completed.
+                              format: date-time
+                              type: string
+                            message:
+                              description: Message is a display message about the
+                                step, including any errors.
+                              type: string
+                            startedAt:
+                              description: |-
+                                StartedAt is the time at which the first attempt to execute the step
+                                began.
+                              format: date-time
+                              type: string
+                            status:
+                              description: Status is the high-level outcome of the
+                                step.
+                              type: string
+                          type: object
+                        type: array
                     type: object
                 required:
                 - name
                 type: object
@@ -1857,51 +2142,8 @@
                 type: string
               health:
                 description: Health is the Stage's last observed health.
                 properties:
-                  argoCDApps:
-                    description: ArgoCDApps describes the current state of any related
-                      ArgoCD Applications.
-                    items:
-                      description: ArgoCDAppStatus describes the current state of
-                        a single ArgoCD Application.
-                      properties:
-                        healthStatus:
-                          description: HealthStatus is the health of the ArgoCD Application.
-                          properties:
-                            message:
-                              type: string
-                            status:
-                              type: string
-                          required:
-                          - status
-                          type: object
-                        name:
-                          description: Name is the name of the ArgoCD Application.
-                          type: string
-                        namespace:
-                          description: Namespace is the namespace of the ArgoCD Application.
-                          type: string
-                        syncStatus:
-                          description: SyncStatus is the sync status of the ArgoCD
-                            Application.
-                          properties:
-                            revision:
-                              type: string
-                            revisions:
-                              items:
-                                type: string
-                              type: array
-                            status:
-                              type: string
-                          required:
-                          - status
-                          type: object
-                      required:
-                      - name
-                      - namespace
-                      type: object
-                    type: array
                   config:
                     description: |-
                       Config is the opaque configuration of all health checks performed on this
                       Stage.
@@ -2446,8 +2688,47 @@
                         description: |-
                           State stores the state of the promotion process between reconciliation
                           attempts.
                         x-kubernetes-preserve-unknown-fields: true
+                      stepExecutionMetadata:
+                        description: |-
+                          StepExecutionMetadata tracks metadata pertaining to the execution
+                          of individual promotion steps.
+                        items:
+                          description: |-
+                            StepExecutionMetadata tracks metadata pertaining to the execution of
+                            a promotion step.
+                          properties:
+                            alias:
+                              description: Alias is the alias of the step.
+                              type: string
+                            errorCount:
+                              description: ErrorCount tracks consecutive failed attempts
+                                to execute the step.
+                              format: int32
+                              type: integer
+                            finishedAt:
+                              description: |-
+                                FinishedAt is the time at which the final attempt to execute the step
+                                completed.
+                              format: date-time
+                              type: string
+                            message:
+                              description: Message is a display message about the
+                                step, including any errors.
+                              type: string
+                            startedAt:
+                              description: |-
+                                StartedAt is the time at which the first attempt to execute the step
+                                began.
+                              format: date-time
+                              type: string
+                            status:
+                              description: Status is the high-level outcome of the
+                                step.
+                              type: string
+                          type: object
+                        type: array
                     type: object
                 required:
                 - name
                 type: object
@@ -2478,9 +2759,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: warehouses.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -2528,8 +2809,9 @@
                 description: |-
                   FreightCreationPolicy describes how Freight is created by this Warehouse.
                   This field is optional. When left unspecified, the field is implicitly
                   treated as if its value were "Automatic".
+                  Accepted values: Automatic, Manual
                 enum:
                 - Automatic
                 - Manual
                 type: string
@@ -2637,8 +2919,9 @@
                             CommitSelectionStrategy specifies the rules for how to identify the newest
                             commit of interest in the repository specified by the RepoURL field. This
                             field is optional. When left unspecified, the field is implicitly treated
                             as if its value were "NewestFromBranch".
+                            Accepted values: Lexical, NewestFromBranch, NewestTag, SemVer
                           enum:
                           - Lexical
                           - NewestFromBranch
                           - NewestTag
@@ -2782,8 +3065,9 @@
                             ImageSelectionStrategy specifies the rules for how to identify the newest version
                             of the image specified by the RepoURL field. This field is optional. When
                             left unspecified, the field is implicitly treated as if its value were
                             "SemVer".
+                            Accepted values: Digest, Lexical, NewestBuild, SemVer
                           enum:
                           - Digest
                           - Lexical
                           - NewestBuild
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-role-bindings.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-role-bindings.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-role-bindings.yaml	2024-12-09 23:44:45.391276545 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-role-bindings.yaml	2024-12-09 23:44:17.608163442 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-garbage-collector
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-roles.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-roles.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-roles.yaml	2024-12-09 23:44:45.391276545 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-roles.yaml	2024-12-09 23:44:17.608163442 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-garbage-collector
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/configmap.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/configmap.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/configmap.yaml	2024-12-09 23:44:45.390276542 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/configmap.yaml	2024-12-09 23:44:17.607163438 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-garbage-collector
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
 data:
   LOG_LEVEL: "INFO"
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cron-job.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cron-job.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cron-job.yaml	2024-12-09 23:44:45.392276548 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cron-job.yaml	2024-12-09 23:44:17.609163446 +0000
@@ -5,47 +5,59 @@
 metadata:
   name: kargo-garbage-collector
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
 spec:
   schedule: "0 * * * *"
   concurrencyPolicy: Forbid
   jobTemplate:
     metadata:
       labels:
-        helm.sh/chart: kargo-1.0.3
+        helm.sh/chart: kargo-1.1.1
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
-        app.kubernetes.io/version: "v1.0.3"
+        app.kubernetes.io/version: "v1.1.1"
         app.kubernetes.io/managed-by: Helm
         app.kubernetes.io/component: garbage-collector
       annotations:
         configmap/checksum: a825d50984da3ea04b6adc3590a6a9e0490ba058c6a59506bd0620bc09b1dc74
     spec:
       template:
         metadata:
           labels:
-            helm.sh/chart: kargo-1.0.3
+            helm.sh/chart: kargo-1.1.1
             app.kubernetes.io/name: kargo
             app.kubernetes.io/instance: release-name
-            app.kubernetes.io/version: "v1.0.3"
+            app.kubernetes.io/version: "v1.1.1"
             app.kubernetes.io/managed-by: Helm
             app.kubernetes.io/component: garbage-collector
           annotations:
             configmap/checksum: a825d50984da3ea04b6adc3590a6a9e0490ba058c6a59506bd0620bc09b1dc74
         spec:
           serviceAccountName: kargo-garbage-collector
           containers:
           - name: garbage-collector
-            image: ghcr.io/akuity/kargo:v1.0.3
+            image: ghcr.io/akuity/kargo:v1.1.1
             imagePullPolicy: IfNotPresent
-            command: ["/usr/local/bin/kargo", "garbage-collector"]
+            command: ["/sbin/tini", "--", "/usr/local/bin/kargo"]
+            args: ["garbage-collector"]
+            env:
+            - name: GOMEMLIMIT
+              valueFrom:
+                resourceFieldRef:
+                  containerName: garbage-collector
+                  resource: limits.memory
+            - name: GOMAXPROCS
+              valueFrom:
+                resourceFieldRef:
+                  containerName: garbage-collector
+                  resource: limits.cpu
             envFrom:
             - configMapRef:
                 name: kargo-garbage-collector
             resources:
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/service-account.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/service-account.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/service-account.yaml	2024-12-09 23:44:45.301276272 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/service-account.yaml	2024-12-09 23:44:17.517163063 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/service-account.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/service-account.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/service-account.yaml	2024-12-09 23:44:45.390276542 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/garbage-collector/service-account.yaml	2024-12-09 23:44:17.607163438 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-garbage-collector
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-role-bindings.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-role-bindings.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-role-bindings.yaml	2024-12-09 23:44:45.391276545 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-role-bindings.yaml	2024-12-09 23:44:17.609163446 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-management-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-roles.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-roles.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-roles.yaml	2024-12-09 23:44:45.391276545 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-roles.yaml	2024-12-09 23:44:17.608163442 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-management-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/configmap.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/configmap.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/configmap.yaml	2024-12-09 23:44:45.390276542 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/configmap.yaml	2024-12-09 23:44:17.607163438 +0000
@@ -5,13 +5,16 @@
 metadata:
   name: kargo-management-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
 data:
   KARGO_NAMESPACE: default
   LOG_LEVEL: "INFO"
+  MAX_CONCURRENT_NAMESPACE_RECONCILES: "4"
+  MAX_CONCURRENT_PROJECT_RECONCILES: "4"
+  MAX_CONCURRENT_SERVICE_ACCOUNT_RECONCILES: "4"
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/deployment.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/deployment.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/deployment.yaml	2024-12-09 23:44:45.392276548 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/deployment.yaml	2024-12-09 23:44:17.609163446 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-management-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
 spec:
   replicas: 1
@@ -27,16 +27,28 @@
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
         app.kubernetes.io/component: management-controller
       annotations:
-        configmap/checksum: f12f16e41a5ad2eafe250dc88ee5bbb12da69eef9a24cdd7fe31d77b4af02ef0
+        configmap/checksum: bcf468b0c814c0cda7c1733b1393de92d5d51cfc38ed6b66c2891b895d9071ff
     spec:
       serviceAccount: kargo-management-controller
       containers:
       - name: management-controller
-        image: ghcr.io/akuity/kargo:v1.0.3
+        image: ghcr.io/akuity/kargo:v1.1.1
         imagePullPolicy: IfNotPresent
-        command: ["/usr/local/bin/kargo", "management-controller"]
+        command: ["/sbin/tini", "--", "/usr/local/bin/kargo"]
+        args: ["management-controller"]
+        env:
+        - name: GOMEMLIMIT
+          valueFrom:
+            resourceFieldRef:
+              containerName: management-controller
+              resource: limits.memory
+        - name: GOMAXPROCS
+          valueFrom:
+            resourceFieldRef:
+              containerName: management-controller
+              resource: limits.cpu
         envFrom:
         - configMapRef:
             name: kargo-management-controller
         resources:
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/service-account.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/service-account.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/service-account.yaml	2024-12-09 23:44:45.390276542 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/management-controller/service-account.yaml	2024-12-09 23:44:17.607163438 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-management-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/users/cluster-role-bindings.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/users/cluster-role-bindings.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/users/cluster-role-bindings.yaml	2024-12-09 23:44:45.392276548 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/users/cluster-role-bindings.yaml	2024-12-09 23:44:17.609163446 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-admin
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
@@ -24,12 +24,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-viewer
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/users/cluster-roles.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/users/cluster-roles.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/users/cluster-roles.yaml	2024-12-09 23:44:45.391276545 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/users/cluster-roles.yaml	2024-12-09 23:44:17.608163442 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-admin
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
 rules:
 - apiGroups:
   - ""
@@ -84,12 +84,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-viewer
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
 rules:
 - apiGroups:
   - ""
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/users/service-accounts.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/users/service-accounts.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/users/service-accounts.yaml	2024-12-09 23:44:45.390276542 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/users/service-accounts.yaml	2024-12-09 23:44:17.607163438 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-admin
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
 ---
 # Source: sx-kargo/charts/kargo/templates/users/service-accounts.yaml
 apiVersion: v1
@@ -18,9 +18,9 @@
 metadata:
   name: kargo-viewer
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks/webhooks.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks/webhooks.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks/webhooks.yaml	2024-12-09 23:44:45.392276548 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks/webhooks.yaml	2024-12-09 23:44:17.610163450 +0000
@@ -4,12 +4,12 @@
 kind: MutatingWebhookConfiguration
 metadata:
   name: kargo
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
   annotations:
     cert-manager.io/inject-ca-from: default/kargo-webhooks-server
@@ -80,12 +80,12 @@
 kind: ValidatingWebhookConfiguration
 metadata:
   name: kargo
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
   annotations:
     cert-manager.io/inject-ca-from: default/kargo-webhooks-server
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/crds.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/crds.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/crds.yaml	2024-12-09 23:44:45.302276275 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/crds.yaml	2024-12-09 23:44:17.518163067 +0000
@@ -3,9 +3,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: freights.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -205,9 +205,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: projects.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -373,9 +373,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: promotions.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -460,10 +460,58 @@
                     as:
                       description: As is the alias this step can be referred to as.
                       type: string
                     config:
-                      description: Config is the configuration for the directive.
+                      description: |-
+                        Config is opaque configuration for the PromotionStep that is understood
+                        only by each PromotionStep's implementation. It is legal to utilize
+                        expressions in defining values at any level of this block.
+                        See https://docs.kargo.io/references/expression-language for details.
                       x-kubernetes-preserve-unknown-fields: true
+                    retry:
+                      description: Retry is the retry policy for this step.
+                      properties:
+                        errorThreshold:
+                          description: |-
+                            ErrorThreshold is the number of consecutive times the step must fail (for
+                            any reason) before retries are abandoned and the entire Promotion is marked
+                            as failed.
+
+                            If this field is set to 0, the effective default will be a step-specific
+                            one. If no step-specific default exists (i.e. is also 0), the effective
+                            default will be the system-wide default of 1.
+
+                            A value of 1 will cause the Promotion to be marked as failed after just
+                            a single failure; i.e. no retries will be attempted.
+
+                            There is no option to specify an infinite number of retries using a value
+                            such as -1.
+
+                            In a future release, Kargo is likely to become capable of distinguishing
+                            between recoverable and non-recoverable step failures. At that time, it is
+                            planned that unrecoverable failures will not be subject to this threshold
+                            and will immediately cause the Promotion to be marked as failed without
+                            further condition.
+                          format: int32
+                          type: integer
+                        timeout:
+                          description: |-
+                            Timeout is the soft maximum interval in which a step that returns a Running
+                            status (which typically indicates it's waiting for something to happen)
+                            may be retried.
+
+                            The maximum is a soft one because the check for whether the interval has
+                            elapsed occurs AFTER the step has run. This effectively means a step may
+                            run ONCE beyond the close of the interval.
+
+                            If this field is set to nil, the effective default will be a step-specific
+                            one. If no step-specific default exists (i.e. is also nil), the effective
+                            default will be the system-wide default of 0.
+
+                            A value of 0 will cause the step to be retried indefinitely unless the
+                            ErrorThreshold is reached.
+                          type: string
+                      type: object
                     uses:
                       description: Uses identifies a runner that can execute this
                         step.
                       minLength: 1
@@ -471,8 +519,33 @@
                   required:
                   - uses
                   type: object
                 type: array
+              vars:
+                description: |-
+                  Vars is a list of variables that can be referenced by expressions in
+                  promotion steps.
+                items:
+                  description: |-
+                    PromotionVariable describes a single variable that may be referenced by
+                    expressions in promotion steps.
+                  properties:
+                    name:
+                      description: Name is the name of the variable.
+                      minLength: 1
+                      pattern: ^[a-zA-Z_]\w*$
+                      type: string
+                    value:
+                      description: |-
+                        Value is the value of the variable. It is allowed to utilize expressions
+                        in the value.
+                        See https://docs.kargo.io/references/expression-language for details.
+                      type: string
+                  required:
+                  - name
+                  - value
+                  type: object
+                type: array
             required:
             - freight
             - stage
             type: object
@@ -857,8 +930,46 @@
                 description: |-
                   State stores the state of the promotion process between reconciliation
                   attempts.
                 x-kubernetes-preserve-unknown-fields: true
+              stepExecutionMetadata:
+                description: |-
+                  StepExecutionMetadata tracks metadata pertaining to the execution
+                  of individual promotion steps.
+                items:
+                  description: |-
+                    StepExecutionMetadata tracks metadata pertaining to the execution of
+                    a promotion step.
+                  properties:
+                    alias:
+                      description: Alias is the alias of the step.
+                      type: string
+                    errorCount:
+                      description: ErrorCount tracks consecutive failed attempts to
+                        execute the step.
+                      format: int32
+                      type: integer
+                    finishedAt:
+                      description: |-
+                        FinishedAt is the time at which the final attempt to execute the step
+                        completed.
+                      format: date-time
+                      type: string
+                    message:
+                      description: Message is a display message about the step, including
+                        any errors.
+                      type: string
+                    startedAt:
+                      description: |-
+                        StartedAt is the time at which the first attempt to execute the step
+                        began.
+                      format: date-time
+                      type: string
+                    status:
+                      description: Status is the high-level outcome of the step.
+                      type: string
+                  type: object
+                type: array
             type: object
         required:
         - spec
         type: object
@@ -871,9 +982,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: stages.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -951,10 +1062,58 @@
                               description: As is the alias this step can be referred
                                 to as.
                               type: string
                             config:
-                              description: Config is the configuration for the directive.
+                              description: |-
+                                Config is opaque configuration for the PromotionStep that is understood
+                                only by each PromotionStep's implementation. It is legal to utilize
+                                expressions in defining values at any level of this block.
+                                See https://docs.kargo.io/references/expression-language for details.
                               x-kubernetes-preserve-unknown-fields: true
+                            retry:
+                              description: Retry is the retry policy for this step.
+                              properties:
+                                errorThreshold:
+                                  description: |-
+                                    ErrorThreshold is the number of consecutive times the step must fail (for
+                                    any reason) before retries are abandoned and the entire Promotion is marked
+                                    as failed.
+
+                                    If this field is set to 0, the effective default will be a step-specific
+                                    one. If no step-specific default exists (i.e. is also 0), the effective
+                                    default will be the system-wide default of 1.
+
+                                    A value of 1 will cause the Promotion to be marked as failed after just
+                                    a single failure; i.e. no retries will be attempted.
+
+                                    There is no option to specify an infinite number of retries using a value
+                                    such as -1.
+
+                                    In a future release, Kargo is likely to become capable of distinguishing
+                                    between recoverable and non-recoverable step failures. At that time, it is
+                                    planned that unrecoverable failures will not be subject to this threshold
+                                    and will immediately cause the Promotion to be marked as failed without
+                                    further condition.
+                                  format: int32
+                                  type: integer
+                                timeout:
+                                  description: |-
+                                    Timeout is the soft maximum interval in which a step that returns a Running
+                                    status (which typically indicates it's waiting for something to happen)
+                                    may be retried.
+
+                                    The maximum is a soft one because the check for whether the interval has
+                                    elapsed occurs AFTER the step has run. This effectively means a step may
+                                    run ONCE beyond the close of the interval.
+
+                                    If this field is set to nil, the effective default will be a step-specific
+                                    one. If no step-specific default exists (i.e. is also nil), the effective
+                                    default will be the system-wide default of 0.
+
+                                    A value of 0 will cause the step to be retried indefinitely unless the
+                                    ErrorThreshold is reached.
+                                  type: string
+                              type: object
                             uses:
                               description: Uses identifies a runner that can execute
                                 this step.
                               minLength: 1
@@ -963,8 +1122,33 @@
                           - uses
                           type: object
                         minItems: 1
                         type: array
+                      vars:
+                        description: |-
+                          Vars is a list of variables that can be referenced by expressions in
+                          promotion steps.
+                        items:
+                          description: |-
+                            PromotionVariable describes a single variable that may be referenced by
+                            expressions in promotion steps.
+                          properties:
+                            name:
+                              description: Name is the name of the variable.
+                              minLength: 1
+                              pattern: ^[a-zA-Z_]\w*$
+                              type: string
+                            value:
+                              description: |-
+                                Value is the value of the variable. It is allowed to utilize expressions
+                                in the value.
+                                See https://docs.kargo.io/references/expression-language for details.
+                              type: string
+                          required:
+                          - name
+                          - value
+                          type: object
+                        type: array
                     type: object
                 required:
                 - spec
                 type: object
@@ -1104,8 +1288,70 @@
           status:
             description: Status describes the Stage's current and recent Freight,
               health, and more.
             properties:
+              conditions:
+                description: |-
+                  Conditions contains the last observations of the Stage's current
+                  state.
+                items:
+                  description: Condition contains details for one aspect of the current
+                    state of this API Resource.
+                  properties:
+                    lastTransitionTime:
+                      description: |-
+                        lastTransitionTime is the last time the condition transitioned from one status to another.
+                        This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.
+                      format: date-time
+                      type: string
+                    message:
+                      description: |-
+                        message is a human readable message indicating details about the transition.
+                        This may be an empty string.
+                      maxLength: 32768
+                      type: string
+                    observedGeneration:
+                      description: |-
+                        observedGeneration represents the .metadata.generation that the condition was set based upon.
+                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date
+                        with respect to the current state of the instance.
+                      format: int64
+                      minimum: 0
+                      type: integer
+                    reason:
+                      description: |-
+                        reason contains a programmatic identifier indicating the reason for the condition's last transition.
+                        Producers of specific condition types may define expected values and meanings for this field,
+                        and whether the values are considered a guaranteed API.
+                        The value should be a CamelCase string.
+                        This field may not be empty.
+                      maxLength: 1024
+                      minLength: 1
+                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
+                      type: string
+                    status:
+                      description: status of the condition, one of True, False, Unknown.
+                      enum:
+                      - "True"
+                      - "False"
+                      - Unknown
+                      type: string
+                    type:
+                      description: type of condition in CamelCase or in foo.example.com/CamelCase.
+                      maxLength: 316
+                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
+                      type: string
+                  required:
+                  - lastTransitionTime
+                  - message
+                  - reason
+                  - status
+                  - type
+                  type: object
+                type: array
+                x-kubernetes-list-map-keys:
+                - type
+                x-kubernetes-list-type: map
               currentPromotion:
                 description: CurrentPromotion is a reference to the currently Running
                   promotion.
                 properties:
@@ -1625,8 +1871,47 @@
                         description: |-
                           State stores the state of the promotion process between reconciliation
                           attempts.
                         x-kubernetes-preserve-unknown-fields: true
+                      stepExecutionMetadata:
+                        description: |-
+                          StepExecutionMetadata tracks metadata pertaining to the execution
+                          of individual promotion steps.
+                        items:
+                          description: |-
+                            StepExecutionMetadata tracks metadata pertaining to the execution of
+                            a promotion step.
+                          properties:
+                            alias:
+                              description: Alias is the alias of the step.
+                              type: string
+                            errorCount:
+                              description: ErrorCount tracks consecutive failed attempts
+                                to execute the step.
+                              format: int32
+                              type: integer
+                            finishedAt:
+                              description: |-
+                                FinishedAt is the time at which the final attempt to execute the step
+                                completed.
+                              format: date-time
+                              type: string
+                            message:
+                              description: Message is a display message about the
+                                step, including any errors.
+                              type: string
+                            startedAt:
+                              description: |-
+                                StartedAt is the time at which the first attempt to execute the step
+                                began.
+                              format: date-time
+                              type: string
+                            status:
+                              description: Status is the high-level outcome of the
+                                step.
+                              type: string
+                          type: object
+                        type: array
                     type: object
                 required:
                 - name
                 type: object
@@ -1857,51 +2142,8 @@
                 type: string
               health:
                 description: Health is the Stage's last observed health.
                 properties:
-                  argoCDApps:
-                    description: ArgoCDApps describes the current state of any related
-                      ArgoCD Applications.
-                    items:
-                      description: ArgoCDAppStatus describes the current state of
-                        a single ArgoCD Application.
-                      properties:
-                        healthStatus:
-                          description: HealthStatus is the health of the ArgoCD Application.
-                          properties:
-                            message:
-                              type: string
-                            status:
-                              type: string
-                          required:
-                          - status
-                          type: object
-                        name:
-                          description: Name is the name of the ArgoCD Application.
-                          type: string
-                        namespace:
-                          description: Namespace is the namespace of the ArgoCD Application.
-                          type: string
-                        syncStatus:
-                          description: SyncStatus is the sync status of the ArgoCD
-                            Application.
-                          properties:
-                            revision:
-                              type: string
-                            revisions:
-                              items:
-                                type: string
-                              type: array
-                            status:
-                              type: string
-                          required:
-                          - status
-                          type: object
-                      required:
-                      - name
-                      - namespace
-                      type: object
-                    type: array
                   config:
                     description: |-
                       Config is the opaque configuration of all health checks performed on this
                       Stage.
@@ -2446,8 +2688,47 @@
                         description: |-
                           State stores the state of the promotion process between reconciliation
                           attempts.
                         x-kubernetes-preserve-unknown-fields: true
+                      stepExecutionMetadata:
+                        description: |-
+                          StepExecutionMetadata tracks metadata pertaining to the execution
+                          of individual promotion steps.
+                        items:
+                          description: |-
+                            StepExecutionMetadata tracks metadata pertaining to the execution of
+                            a promotion step.
+                          properties:
+                            alias:
+                              description: Alias is the alias of the step.
+                              type: string
+                            errorCount:
+                              description: ErrorCount tracks consecutive failed attempts
+                                to execute the step.
+                              format: int32
+                              type: integer
+                            finishedAt:
+                              description: |-
+                                FinishedAt is the time at which the final attempt to execute the step
+                                completed.
+                              format: date-time
+                              type: string
+                            message:
+                              description: Message is a display message about the
+                                step, including any errors.
+                              type: string
+                            startedAt:
+                              description: |-
+                                StartedAt is the time at which the first attempt to execute the step
+                                began.
+                              format: date-time
+                              type: string
+                            status:
+                              description: Status is the high-level outcome of the
+                                step.
+                              type: string
+                          type: object
+                        type: array
                     type: object
                 required:
                 - name
                 type: object
@@ -2478,9 +2759,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: warehouses.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -2528,8 +2809,9 @@
                 description: |-
                   FreightCreationPolicy describes how Freight is created by this Warehouse.
                   This field is optional. When left unspecified, the field is implicitly
                   treated as if its value were "Automatic".
+                  Accepted values: Automatic, Manual
                 enum:
                 - Automatic
                 - Manual
                 type: string
@@ -2637,8 +2919,9 @@
                             CommitSelectionStrategy specifies the rules for how to identify the newest
                             commit of interest in the repository specified by the RepoURL field. This
                             field is optional. When left unspecified, the field is implicitly treated
                             as if its value were "NewestFromBranch".
+                            Accepted values: Lexical, NewestFromBranch, NewestTag, SemVer
                           enum:
                           - Lexical
                           - NewestFromBranch
                           - NewestTag
@@ -2782,8 +3065,9 @@
                             ImageSelectionStrategy specifies the rules for how to identify the newest version
                             of the image specified by the RepoURL field. This field is optional. When
                             left unspecified, the field is implicitly treated as if its value were
                             "SemVer".
+                            Accepted values: Digest, Lexical, NewestBuild, SemVer
                           enum:
                           - Digest
                           - Lexical
                           - NewestBuild
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role-binding.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role-binding.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role-binding.yaml	2024-12-09 23:44:45.392276548 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role-binding.yaml	2024-12-09 23:44:17.609163446 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-webhooks-server
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -25,12 +25,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-webhooks-server-ns-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -46,12 +46,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-webhooks-server-generic-gc
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role.yaml	2024-12-09 23:44:45.391276545 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role.yaml	2024-12-09 23:44:17.608163442 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-webhooks-server
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 rules:
 - apiGroups:
@@ -79,12 +79,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-webhooks-server-ns-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 rules:
 - apiGroups:
@@ -105,12 +105,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-webhooks-server-generic-gc
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/configmap.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/configmap.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/configmap.yaml	2024-12-09 23:44:45.390276542 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/configmap.yaml	2024-12-09 23:44:17.607163438 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-webhooks-server
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 data:
   KARGO_NAMESPACE: default
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/deployment.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/deployment.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/deployment.yaml	2024-12-09 23:44:45.392276548 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/deployment.yaml	2024-12-09 23:44:17.609163446 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-webhooks-server
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 spec:
   replicas: 1
@@ -23,23 +23,35 @@
       app.kubernetes.io/component: webhooks-server
   template:
     metadata:
       labels:
-        helm.sh/chart: kargo-1.0.3
+        helm.sh/chart: kargo-1.1.1
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
-        app.kubernetes.io/version: "v1.0.3"
+        app.kubernetes.io/version: "v1.1.1"
         app.kubernetes.io/managed-by: Helm
         app.kubernetes.io/component: webhooks-server
       annotations:
         configmap/checksum: 517e77c4dd49419d768a458d24a72e747c19a23a0eb5f022b3fe25fd49dd5a7c
     spec:
       serviceAccount: kargo-webhooks-server
       containers:
       - name: webhooks-server
-        image: ghcr.io/akuity/kargo:v1.0.3
+        image: ghcr.io/akuity/kargo:v1.1.1
         imagePullPolicy: IfNotPresent
-        command: ["/usr/local/bin/kargo", "webhooks-server"]
+        command: ["/sbin/tini", "--", "/usr/local/bin/kargo"]
+        args: ["webhooks-server"]
+        env:
+        - name: GOMEMLIMIT
+          valueFrom:
+            resourceFieldRef:
+              containerName: webhooks-server
+              resource: limits.memory
+        - name: GOMAXPROCS
+          valueFrom:
+            resourceFieldRef:
+              containerName: webhooks-server
+              resource: limits.cpu
         envFrom:
         - configMapRef:
             name: kargo-webhooks-server
         ports:
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service-account.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service-account.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service-account.yaml	2024-12-09 23:44:45.390276542 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service-account.yaml	2024-12-09 23:44:17.607163438 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-webhooks-server
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
diff -U 4 -r out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service.yaml out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service.yaml
--- out/target/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service.yaml	2024-12-09 23:44:45.392276548 +0000
+++ out/pr/kargo/values-uibklab.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service.yaml	2024-12-09 23:44:17.609163446 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-webhooks-server
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 spec:
   type: ClusterIP
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-role-bindings.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-role-bindings.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-role-bindings.yaml	2024-12-09 23:44:45.303276278 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-role-bindings.yaml	2024-12-09 23:44:17.519163071 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-garbage-collector
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-roles.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-roles.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-roles.yaml	2024-12-09 23:44:45.303276278 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-roles.yaml	2024-12-09 23:44:17.518163067 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-garbage-collector
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/configmap.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/configmap.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/configmap.yaml	2024-12-09 23:44:45.302276275 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/configmap.yaml	2024-12-09 23:44:17.517163063 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-garbage-collector
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
 data:
   LOG_LEVEL: "INFO"
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cron-job.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cron-job.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cron-job.yaml	2024-12-09 23:44:45.304276281 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cron-job.yaml	2024-12-09 23:44:17.519163071 +0000
@@ -5,47 +5,59 @@
 metadata:
   name: kargo-garbage-collector
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
 spec:
   schedule: "0 * * * *"
   concurrencyPolicy: Forbid
   jobTemplate:
     metadata:
       labels:
-        helm.sh/chart: kargo-1.0.3
+        helm.sh/chart: kargo-1.1.1
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
-        app.kubernetes.io/version: "v1.0.3"
+        app.kubernetes.io/version: "v1.1.1"
         app.kubernetes.io/managed-by: Helm
         app.kubernetes.io/component: garbage-collector
       annotations:
         configmap/checksum: a825d50984da3ea04b6adc3590a6a9e0490ba058c6a59506bd0620bc09b1dc74
     spec:
       template:
         metadata:
           labels:
-            helm.sh/chart: kargo-1.0.3
+            helm.sh/chart: kargo-1.1.1
             app.kubernetes.io/name: kargo
             app.kubernetes.io/instance: release-name
-            app.kubernetes.io/version: "v1.0.3"
+            app.kubernetes.io/version: "v1.1.1"
             app.kubernetes.io/managed-by: Helm
             app.kubernetes.io/component: garbage-collector
           annotations:
             configmap/checksum: a825d50984da3ea04b6adc3590a6a9e0490ba058c6a59506bd0620bc09b1dc74
         spec:
           serviceAccountName: kargo-garbage-collector
           containers:
           - name: garbage-collector
-            image: ghcr.io/akuity/kargo:v1.0.3
+            image: ghcr.io/akuity/kargo:v1.1.1
             imagePullPolicy: IfNotPresent
-            command: ["/usr/local/bin/kargo", "garbage-collector"]
+            command: ["/sbin/tini", "--", "/usr/local/bin/kargo"]
+            args: ["garbage-collector"]
+            env:
+            - name: GOMEMLIMIT
+              valueFrom:
+                resourceFieldRef:
+                  containerName: garbage-collector
+                  resource: limits.memory
+            - name: GOMAXPROCS
+              valueFrom:
+                resourceFieldRef:
+                  containerName: garbage-collector
+                  resource: limits.cpu
             envFrom:
             - configMapRef:
                 name: kargo-garbage-collector
             resources:
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/service-account.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/service-account.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/service-account.yaml	2024-12-09 23:44:45.301276272 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/service-account.yaml	2024-12-09 23:44:17.517163063 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-garbage-collector
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-role-bindings.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-role-bindings.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-role-bindings.yaml	2024-12-09 23:44:45.303276278 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-role-bindings.yaml	2024-12-09 23:44:17.519163071 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-management-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-roles.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-roles.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-roles.yaml	2024-12-09 23:44:45.303276278 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-roles.yaml	2024-12-09 23:44:17.518163067 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-management-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/configmap.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/configmap.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/configmap.yaml	2024-12-09 23:44:45.302276275 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/configmap.yaml	2024-12-09 23:44:17.517163063 +0000
@@ -5,13 +5,16 @@
 metadata:
   name: kargo-management-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
 data:
   KARGO_NAMESPACE: default
   LOG_LEVEL: "INFO"
+  MAX_CONCURRENT_NAMESPACE_RECONCILES: "4"
+  MAX_CONCURRENT_PROJECT_RECONCILES: "4"
+  MAX_CONCURRENT_SERVICE_ACCOUNT_RECONCILES: "4"

Copy link
Contributor

github-actions bot commented Dec 9, 2024

Changes Default Values
diff -U 4 -r out-default-values/target/kargo_kargo_default-values.out out-default-values/pr/kargo_kargo_default-values.out
--- out-default-values/target/kargo_kargo_default-values.out	2024-12-09 23:44:45.554277038 +0000
+++ out-default-values/pr/kargo_kargo_default-values.out	2024-12-09 23:44:17.777164146 +0000
@@ -312,9 +312,9 @@
       #     redirectURI: <http(s)>://<api.host>/dex/callback
       ## Azure Example
       # - id: microsoft
       #   name: microsoft
-      #   type: Microsoft
+      #   type: microsoft
       #   config:
       #     clientID: <your client ID>
       #     clientSecret: "$CLIENT_SECRET"
       #     redirectURI: <http(s)>://<api.host>/dex/callback
@@ -376,8 +376,25 @@
   globalCredentials:
     ## @param controller.globalCredentials.namespaces List of namespaces to look for shared credentials. Note that as of v1.0.0, the Kargo controller does not have cluster-wide access to Secrets. The controller receives read-only permission for Secrets on a per-Project basis as Projects are created. If you designate some namespaces as homes for "global" credentials, you will need to manually grant the controller permission to read Secrets in those namespaces.
     namespaces: []
 
+  ## Reconciler-specific settings
+  reconcilers:
+    ## @param controller.reconcilers.maxConcurrentReconciles specifies the maximum number of resources EACH of the controller's reconcilers can reconcile concurrently. This setting may also be overridden on a per-reconciler basis.
+    maxConcurrentReconciles: 4
+    controlFlowStages:
+      ## @param controller.reconcilers.controlFlowStages.maxConcurrentReconciles optionally overrides the maximum number of control flow Stage resources the controller can reconcile concurrently.
+      maxConcurrentReconciles:
+    promotions:
+      ## @param controller.reconcilers.promotions.maxConcurrentReconciles optionally overrides the maximum number of Promotion resources the controller can reconcile concurrently.
+      maxConcurrentReconciles:
+    stages:
+      ## @param controller.reconcilers.stages.maxConcurrentReconciles optionally overrides the maximum number of (non-control flow) Stage resources the controller can reconcile concurrently.
+      maxConcurrentReconciles:
+    warehouses:
+      ## @param controller.reconcilers.warehouses.maxConcurrentReconciles optionally overrides the maximum number of Warehouse resources the controller can reconcile concurrently.
+      maxConcurrentReconciles:
+
   gitClient:
     ## @param controller.gitClient.name Specifies the name of the Kargo controller (used when authoring Git commits).
     name: "Kargo"
     ## @param controller.gitClient.email Specifies the email of the Kargo controller (used when authoring Git commits).
@@ -464,8 +481,22 @@
   podLabels: {}
   ## @param managementController.podAnnotations Optional annotations to add to pods. Merges with `global.podAnnotations`, allowing you to override or add to the global annotations.
   podAnnotations: {}
 
+  ## Reconciler-specific settings
+  reconcilers:
+    ## @param managementController.reconcilers.maxConcurrentReconciles specifies the maximum number of resources EACH of the management controller's reconcilers can reconcile concurrently. This setting may also be overridden on a per-reconciler basis.
+    maxConcurrentReconciles: 4
+    namespaces:
+      ## @param managementController.reconcilers.namespaces.maxConcurrentReconciles optionally overrides the maximum number of Namespace resources the management controller can reconcile concurrently.
+      maxConcurrentReconciles:
+    projects:
+      ## @param managementController.reconcilers.projects.maxConcurrentReconciles optionally overrides the maximum number of Project resources the management controller can reconcile concurrently.
+      maxConcurrentReconciles:
+    serviceAccounts:
+      ## @param managementController.reconcilers.serviceAccounts.maxConcurrentReconciles optionally overrides the maximum number of ServiceAccount resources the management controller can reconcile concurrently.
+      maxConcurrentReconciles:
+
   ## @param managementController.securityContext Security context for management controller pods. Defaults to `global.securityContext`.
   securityContext: {}
 
   ## @param managementController.resources Resources limits and requests for the management controller containers.

Copy link
Contributor

github-actions bot commented Dec 9, 2024

Changes Rendered Chart
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/deployment.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/deployment.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/deployment.yaml	2024-12-09 23:44:45.304276281 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/deployment.yaml	2024-12-09 23:44:17.519163071 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-management-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
 spec:
   replicas: 1
@@ -27,16 +27,28 @@
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
         app.kubernetes.io/component: management-controller
       annotations:
-        configmap/checksum: f12f16e41a5ad2eafe250dc88ee5bbb12da69eef9a24cdd7fe31d77b4af02ef0
+        configmap/checksum: bcf468b0c814c0cda7c1733b1393de92d5d51cfc38ed6b66c2891b895d9071ff
     spec:
       serviceAccount: kargo-management-controller
       containers:
       - name: management-controller
-        image: ghcr.io/akuity/kargo:v1.0.3
+        image: ghcr.io/akuity/kargo:v1.1.1
         imagePullPolicy: IfNotPresent
-        command: ["/usr/local/bin/kargo", "management-controller"]
+        command: ["/sbin/tini", "--", "/usr/local/bin/kargo"]
+        args: ["management-controller"]
+        env:
+        - name: GOMEMLIMIT
+          valueFrom:
+            resourceFieldRef:
+              containerName: management-controller
+              resource: limits.memory
+        - name: GOMAXPROCS
+          valueFrom:
+            resourceFieldRef:
+              containerName: management-controller
+              resource: limits.cpu
         envFrom:
         - configMapRef:
             name: kargo-management-controller
         resources:
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/service-account.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/service-account.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/service-account.yaml	2024-12-09 23:44:45.301276272 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/service-account.yaml	2024-12-09 23:44:17.517163063 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-management-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/users/cluster-role-bindings.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/users/cluster-role-bindings.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/users/cluster-role-bindings.yaml	2024-12-09 23:44:45.303276278 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/users/cluster-role-bindings.yaml	2024-12-09 23:44:17.519163071 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-admin
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
@@ -24,12 +24,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-viewer
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/users/cluster-roles.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/users/cluster-roles.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/users/cluster-roles.yaml	2024-12-09 23:44:45.303276278 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/users/cluster-roles.yaml	2024-12-09 23:44:17.518163067 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-admin
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
 rules:
 - apiGroups:
   - ""
@@ -84,12 +84,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-viewer
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
 rules:
 - apiGroups:
   - ""
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/users/service-accounts.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/users/service-accounts.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/users/service-accounts.yaml	2024-12-09 23:44:45.301276272 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/users/service-accounts.yaml	2024-12-09 23:44:17.517163063 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-admin
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
 ---
 # Source: sx-kargo/charts/kargo/templates/users/service-accounts.yaml
 apiVersion: v1
@@ -18,9 +18,9 @@
 metadata:
   name: kargo-viewer
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks/webhooks.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks/webhooks.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks/webhooks.yaml	2024-12-09 23:44:45.304276281 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks/webhooks.yaml	2024-12-09 23:44:17.519163071 +0000
@@ -4,12 +4,12 @@
 kind: MutatingWebhookConfiguration
 metadata:
   name: kargo
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
   annotations:
     cert-manager.io/inject-ca-from: default/kargo-webhooks-server
@@ -80,12 +80,12 @@
 kind: ValidatingWebhookConfiguration
 metadata:
   name: kargo
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
   annotations:
     cert-manager.io/inject-ca-from: default/kargo-webhooks-server
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role-binding.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role-binding.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role-binding.yaml	2024-12-09 23:44:45.303276278 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role-binding.yaml	2024-12-09 23:44:17.519163071 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-webhooks-server
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -25,12 +25,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-webhooks-server-ns-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -46,12 +46,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-webhooks-server-generic-gc
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role.yaml	2024-12-09 23:44:45.303276278 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role.yaml	2024-12-09 23:44:17.518163067 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-webhooks-server
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 rules:
 - apiGroups:
@@ -79,12 +79,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-webhooks-server-ns-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 rules:
 - apiGroups:
@@ -105,12 +105,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-webhooks-server-generic-gc
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/configmap.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/configmap.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/configmap.yaml	2024-12-09 23:44:45.302276275 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/configmap.yaml	2024-12-09 23:44:17.517163063 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-webhooks-server
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 data:
   KARGO_NAMESPACE: default
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/deployment.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/deployment.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/deployment.yaml	2024-12-09 23:44:45.304276281 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/deployment.yaml	2024-12-09 23:44:17.519163071 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-webhooks-server
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 spec:
   replicas: 1
@@ -23,23 +23,35 @@
       app.kubernetes.io/component: webhooks-server
   template:
     metadata:
       labels:
-        helm.sh/chart: kargo-1.0.3
+        helm.sh/chart: kargo-1.1.1
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
-        app.kubernetes.io/version: "v1.0.3"
+        app.kubernetes.io/version: "v1.1.1"
         app.kubernetes.io/managed-by: Helm
         app.kubernetes.io/component: webhooks-server
       annotations:
         configmap/checksum: 517e77c4dd49419d768a458d24a72e747c19a23a0eb5f022b3fe25fd49dd5a7c
     spec:
       serviceAccount: kargo-webhooks-server
       containers:
       - name: webhooks-server
-        image: ghcr.io/akuity/kargo:v1.0.3
+        image: ghcr.io/akuity/kargo:v1.1.1
         imagePullPolicy: IfNotPresent
-        command: ["/usr/local/bin/kargo", "webhooks-server"]
+        command: ["/sbin/tini", "--", "/usr/local/bin/kargo"]
+        args: ["webhooks-server"]
+        env:
+        - name: GOMEMLIMIT
+          valueFrom:
+            resourceFieldRef:
+              containerName: webhooks-server
+              resource: limits.memory
+        - name: GOMAXPROCS
+          valueFrom:
+            resourceFieldRef:
+              containerName: webhooks-server
+              resource: limits.cpu
         envFrom:
         - configMapRef:
             name: kargo-webhooks-server
         ports:
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service-account.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service-account.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service-account.yaml	2024-12-09 23:44:45.301276272 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service-account.yaml	2024-12-09 23:44:17.517163063 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-webhooks-server
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
diff -U 4 -r out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service.yaml out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service.yaml
--- out/target/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service.yaml	2024-12-09 23:44:45.304276281 +0000
+++ out/pr/kargo/values-demo-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service.yaml	2024-12-09 23:44:17.519163071 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-webhooks-server
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 spec:
   type: ClusterIP
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/cluster-role-binding.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/cluster-role-binding.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/cluster-role-binding.yaml	2024-12-09 23:44:45.217276018 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/cluster-role-binding.yaml	2024-12-09 23:44:17.429162696 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-api
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -25,12 +25,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-api-rollouts
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/cluster-role.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/cluster-role.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/cluster-role.yaml	2024-12-09 23:44:45.217276018 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/cluster-role.yaml	2024-12-09 23:44:17.429162696 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-api
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 rules:
   - apiGroups:
@@ -129,12 +129,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-project-admin
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 rules:
 - apiGroups:
@@ -158,12 +158,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-api-rollouts
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/configmap.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/configmap.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/configmap.yaml	2024-12-09 23:44:45.216276015 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/configmap.yaml	2024-12-09 23:44:17.428162692 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 data:
   KARGO_NAMESPACE: default
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/deployment.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/deployment.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/deployment.yaml	2024-12-09 23:44:45.218276021 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/deployment.yaml	2024-12-09 23:44:17.430162701 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 spec:
   replicas: 1
@@ -23,12 +23,12 @@
       app.kubernetes.io/component: api
   template:
     metadata:
       labels:
-        helm.sh/chart: kargo-1.0.3
+        helm.sh/chart: kargo-1.1.1
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
-        app.kubernetes.io/version: "v1.0.3"
+        app.kubernetes.io/version: "v1.1.1"
         app.kubernetes.io/managed-by: Helm
         app.kubernetes.io/component: api
       annotations:
         configmap/checksum: 161df4d5db34112702d7fabe496334e15b39354f5df79e0cd38e03bc93d413fd
@@ -36,11 +36,22 @@
     spec:
       serviceAccount: kargo-api
       containers:
         - name: api
-          image: ghcr.io/akuity/kargo:v1.0.3
+          image: ghcr.io/akuity/kargo:v1.1.1
           imagePullPolicy: IfNotPresent
           command: ["/usr/local/bin/kargo", "api"]
+          env:
+          - name: GOMEMLIMIT
+            valueFrom:
+              resourceFieldRef:
+                containerName: api
+                resource: limits.memory
+          - name: GOMAXPROCS
+            valueFrom:
+              resourceFieldRef:
+                containerName: api
+                resource: limits.cpu
           envFrom:
           - configMapRef:
               name: kargo-api
           - secretRef:
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/ingress.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/ingress.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/ingress.yaml	2024-12-09 23:44:45.218276021 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/ingress.yaml	2024-12-09 23:44:17.430162701 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 spec:
   rules:
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/secret.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/secret.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/secret.yaml	2024-12-09 23:44:45.216276015 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/secret.yaml	2024-12-09 23:44:17.428162692 +0000
@@ -6,12 +6,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 stringData:  
   ADMIN_ACCOUNT_PASSWORD_HASH: "$2y$10$7FtRo..bKM5qcrp8dv.7f.TDAQLRSge47Dpi8sLM4sWbWqd9kQAha"  
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/service-account.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/service-account.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/service-account.yaml	2024-12-09 23:44:45.216276015 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/service-account.yaml	2024-12-09 23:44:17.427162688 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/service.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/service.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/service.yaml	2024-12-09 23:44:45.218276021 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/api/service.yaml	2024-12-09 23:44:17.430162701 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 spec:
   type: ClusterIP
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/cluster-role-bindings.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/cluster-role-bindings.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/cluster-role-bindings.yaml	2024-12-09 23:44:45.217276018 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/cluster-role-bindings.yaml	2024-12-09 23:44:17.429162696 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -25,12 +25,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-controller-argocd
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -46,12 +46,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-controller-rollouts
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/cluster-roles.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/cluster-roles.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/cluster-roles.yaml	2024-12-09 23:44:45.217276018 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/cluster-roles.yaml	2024-12-09 23:44:17.429162696 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 rules:
 - apiGroups:
@@ -71,12 +71,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-controller-read-secrets
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 rules:
 - apiGroups:
@@ -93,12 +93,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-controller-argocd
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 rules:
 - apiGroups:
@@ -116,12 +116,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-controller-rollouts
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/configmap.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/configmap.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/configmap.yaml	2024-12-09 23:44:45.216276015 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/configmap.yaml	2024-12-09 23:44:17.428162692 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 data:
   API_SERVER_BASE_URL: https://kargo-127-0-0-1.nip.io
@@ -23,4 +23,8 @@
   ARGOCD_NAMESPACE: argocd
   ARGOCD_WATCH_ARGOCD_NAMESPACE_ONLY: "false"
   ROLLOUTS_INTEGRATION_ENABLED: "true"
   ROLLOUTS_CONTROLLER_INSTANCE_ID: ""
+  MAX_CONCURRENT_CONTROL_FLOW_RECONCILES: "4"
+  MAX_CONCURRENT_PROMOTION_RECONCILES: "4"
+  MAX_CONCURRENT_STAGE_RECONCILES: "4"
+  MAX_CONCURRENT_WAREHOUSE_RECONCILES: "4"
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/deployment.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/deployment.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/deployment.yaml	2024-12-09 23:44:45.218276021 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/deployment.yaml	2024-12-09 23:44:17.430162701 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 spec:
   replicas: 1
@@ -23,23 +23,35 @@
       app.kubernetes.io/component: controller
   template:
     metadata:
       labels:
-        helm.sh/chart: kargo-1.0.3
+        helm.sh/chart: kargo-1.1.1
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
-        app.kubernetes.io/version: "v1.0.3"
+        app.kubernetes.io/version: "v1.1.1"
         app.kubernetes.io/managed-by: Helm
         app.kubernetes.io/component: controller
       annotations:
-        configmap/checksum: 6dba877764f1f93fa0d507820c1d098f2c2ee5e65ecef1bb531b1abc574edd7d
+        configmap/checksum: c17c8514f9b79e3d252805ca089ba65e8b076956d44d22e370539e38815288fa
     spec:
       serviceAccount: kargo-controller
       containers:
       - name: controller
-        image: ghcr.io/akuity/kargo:v1.0.3
+        image: ghcr.io/akuity/kargo:v1.1.1
         imagePullPolicy: IfNotPresent
-        command: ["/usr/local/bin/kargo", "controller"]
+        command: ["/sbin/tini", "--", "/usr/local/bin/kargo"]
+        args: ["controller"]
+        env:
+        - name: GOMEMLIMIT
+          valueFrom:
+            resourceFieldRef:
+              containerName: controller
+              resource: limits.memory
+        - name: GOMAXPROCS
+          valueFrom:
+            resourceFieldRef:
+              containerName: controller
+              resource: limits.cpu
         envFrom:
         - configMapRef:
             name: kargo-controller
         resources:
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/service-account.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/service-account.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/service-account.yaml	2024-12-09 23:44:45.216276015 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/controller/service-account.yaml	2024-12-09 23:44:17.428162692 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/crds.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/crds.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/crds.yaml	2024-12-09 23:44:45.217276018 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/crds.yaml	2024-12-09 23:44:17.429162696 +0000
@@ -3,9 +3,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: freights.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -205,9 +205,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: projects.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -373,9 +373,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: promotions.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -460,10 +460,58 @@
                     as:
                       description: As is the alias this step can be referred to as.
                       type: string
                     config:
-                      description: Config is the configuration for the directive.
+                      description: |-
+                        Config is opaque configuration for the PromotionStep that is understood
+                        only by each PromotionStep's implementation. It is legal to utilize
+                        expressions in defining values at any level of this block.
+                        See https://docs.kargo.io/references/expression-language for details.
                       x-kubernetes-preserve-unknown-fields: true
+                    retry:
+                      description: Retry is the retry policy for this step.
+                      properties:
+                        errorThreshold:
+                          description: |-
+                            ErrorThreshold is the number of consecutive times the step must fail (for
+                            any reason) before retries are abandoned and the entire Promotion is marked
+                            as failed.
+
+                            If this field is set to 0, the effective default will be a step-specific
+                            one. If no step-specific default exists (i.e. is also 0), the effective
+                            default will be the system-wide default of 1.
+
+                            A value of 1 will cause the Promotion to be marked as failed after just
+                            a single failure; i.e. no retries will be attempted.
+
+                            There is no option to specify an infinite number of retries using a value
+                            such as -1.
+
+                            In a future release, Kargo is likely to become capable of distinguishing
+                            between recoverable and non-recoverable step failures. At that time, it is
+                            planned that unrecoverable failures will not be subject to this threshold
+                            and will immediately cause the Promotion to be marked as failed without
+                            further condition.
+                          format: int32
+                          type: integer
+                        timeout:
+                          description: |-
+                            Timeout is the soft maximum interval in which a step that returns a Running
+                            status (which typically indicates it's waiting for something to happen)
+                            may be retried.
+
+                            The maximum is a soft one because the check for whether the interval has
+                            elapsed occurs AFTER the step has run. This effectively means a step may
+                            run ONCE beyond the close of the interval.
+
+                            If this field is set to nil, the effective default will be a step-specific
+                            one. If no step-specific default exists (i.e. is also nil), the effective
+                            default will be the system-wide default of 0.
+
+                            A value of 0 will cause the step to be retried indefinitely unless the
+                            ErrorThreshold is reached.
+                          type: string
+                      type: object
                     uses:
                       description: Uses identifies a runner that can execute this
                         step.
                       minLength: 1
@@ -471,8 +519,33 @@
                   required:
                   - uses
                   type: object
                 type: array
+              vars:
+                description: |-
+                  Vars is a list of variables that can be referenced by expressions in
+                  promotion steps.
+                items:
+                  description: |-
+                    PromotionVariable describes a single variable that may be referenced by
+                    expressions in promotion steps.
+                  properties:
+                    name:
+                      description: Name is the name of the variable.
+                      minLength: 1
+                      pattern: ^[a-zA-Z_]\w*$
+                      type: string
+                    value:
+                      description: |-
+                        Value is the value of the variable. It is allowed to utilize expressions
+                        in the value.
+                        See https://docs.kargo.io/references/expression-language for details.
+                      type: string
+                  required:
+                  - name
+                  - value
+                  type: object
+                type: array
             required:
             - freight
             - stage
             type: object
@@ -857,8 +930,46 @@
                 description: |-
                   State stores the state of the promotion process between reconciliation
                   attempts.
                 x-kubernetes-preserve-unknown-fields: true
+              stepExecutionMetadata:
+                description: |-
+                  StepExecutionMetadata tracks metadata pertaining to the execution
+                  of individual promotion steps.
+                items:
+                  description: |-
+                    StepExecutionMetadata tracks metadata pertaining to the execution of
+                    a promotion step.
+                  properties:
+                    alias:
+                      description: Alias is the alias of the step.
+                      type: string
+                    errorCount:
+                      description: ErrorCount tracks consecutive failed attempts to
+                        execute the step.
+                      format: int32
+                      type: integer
+                    finishedAt:
+                      description: |-
+                        FinishedAt is the time at which the final attempt to execute the step
+                        completed.
+                      format: date-time
+                      type: string
+                    message:
+                      description: Message is a display message about the step, including
+                        any errors.
+                      type: string
+                    startedAt:
+                      description: |-
+                        StartedAt is the time at which the first attempt to execute the step
+                        began.
+                      format: date-time
+                      type: string
+                    status:
+                      description: Status is the high-level outcome of the step.
+                      type: string
+                  type: object
+                type: array
             type: object
         required:
         - spec
         type: object
@@ -871,9 +982,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: stages.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -951,10 +1062,58 @@
                               description: As is the alias this step can be referred
                                 to as.
                               type: string
                             config:
-                              description: Config is the configuration for the directive.
+                              description: |-
+                                Config is opaque configuration for the PromotionStep that is understood
+                                only by each PromotionStep's implementation. It is legal to utilize
+                                expressions in defining values at any level of this block.
+                                See https://docs.kargo.io/references/expression-language for details.
                               x-kubernetes-preserve-unknown-fields: true
+                            retry:
+                              description: Retry is the retry policy for this step.
+                              properties:
+                                errorThreshold:
+                                  description: |-
+                                    ErrorThreshold is the number of consecutive times the step must fail (for
+                                    any reason) before retries are abandoned and the entire Promotion is marked
+                                    as failed.
+
+                                    If this field is set to 0, the effective default will be a step-specific
+                                    one. If no step-specific default exists (i.e. is also 0), the effective
+                                    default will be the system-wide default of 1.
+
+                                    A value of 1 will cause the Promotion to be marked as failed after just
+                                    a single failure; i.e. no retries will be attempted.
+
+                                    There is no option to specify an infinite number of retries using a value
+                                    such as -1.
+
+                                    In a future release, Kargo is likely to become capable of distinguishing
+                                    between recoverable and non-recoverable step failures. At that time, it is
+                                    planned that unrecoverable failures will not be subject to this threshold
+                                    and will immediately cause the Promotion to be marked as failed without
+                                    further condition.
+                                  format: int32
+                                  type: integer
+                                timeout:
+                                  description: |-
+                                    Timeout is the soft maximum interval in which a step that returns a Running
+                                    status (which typically indicates it's waiting for something to happen)
+                                    may be retried.
+
+                                    The maximum is a soft one because the check for whether the interval has
+                                    elapsed occurs AFTER the step has run. This effectively means a step may
+                                    run ONCE beyond the close of the interval.
+
+                                    If this field is set to nil, the effective default will be a step-specific
+                                    one. If no step-specific default exists (i.e. is also nil), the effective
+                                    default will be the system-wide default of 0.
+
+                                    A value of 0 will cause the step to be retried indefinitely unless the
+                                    ErrorThreshold is reached.
+                                  type: string
+                              type: object
                             uses:
                               description: Uses identifies a runner that can execute
                                 this step.
                               minLength: 1
@@ -963,8 +1122,33 @@
                           - uses
                           type: object
                         minItems: 1
                         type: array
+                      vars:
+                        description: |-
+                          Vars is a list of variables that can be referenced by expressions in
+                          promotion steps.
+                        items:
+                          description: |-
+                            PromotionVariable describes a single variable that may be referenced by
+                            expressions in promotion steps.
+                          properties:
+                            name:
+                              description: Name is the name of the variable.
+                              minLength: 1
+                              pattern: ^[a-zA-Z_]\w*$
+                              type: string
+                            value:
+                              description: |-
+                                Value is the value of the variable. It is allowed to utilize expressions
+                                in the value.
+                                See https://docs.kargo.io/references/expression-language for details.
+                              type: string
+                          required:
+                          - name
+                          - value
+                          type: object
+                        type: array
                     type: object
                 required:
                 - spec
                 type: object
@@ -1104,8 +1288,70 @@
           status:
             description: Status describes the Stage's current and recent Freight,
               health, and more.
             properties:
+              conditions:
+                description: |-
+                  Conditions contains the last observations of the Stage's current
+                  state.
+                items:
+                  description: Condition contains details for one aspect of the current
+                    state of this API Resource.
+                  properties:
+                    lastTransitionTime:
+                      description: |-
+                        lastTransitionTime is the last time the condition transitioned from one status to another.
+                        This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.
+                      format: date-time
+                      type: string
+                    message:
+                      description: |-
+                        message is a human readable message indicating details about the transition.
+                        This may be an empty string.
+                      maxLength: 32768
+                      type: string
+                    observedGeneration:
+                      description: |-
+                        observedGeneration represents the .metadata.generation that the condition was set based upon.
+                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date
+                        with respect to the current state of the instance.
+                      format: int64
+                      minimum: 0
+                      type: integer
+                    reason:
+                      description: |-
+                        reason contains a programmatic identifier indicating the reason for the condition's last transition.
+                        Producers of specific condition types may define expected values and meanings for this field,
+                        and whether the values are considered a guaranteed API.
+                        The value should be a CamelCase string.
+                        This field may not be empty.
+                      maxLength: 1024
+                      minLength: 1
+                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
+                      type: string
+                    status:
+                      description: status of the condition, one of True, False, Unknown.
+                      enum:
+                      - "True"
+                      - "False"
+                      - Unknown
+                      type: string
+                    type:
+                      description: type of condition in CamelCase or in foo.example.com/CamelCase.
+                      maxLength: 316
+                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
+                      type: string
+                  required:
+                  - lastTransitionTime
+                  - message
+                  - reason
+                  - status
+                  - type
+                  type: object
+                type: array
+                x-kubernetes-list-map-keys:
+                - type
+                x-kubernetes-list-type: map
               currentPromotion:
                 description: CurrentPromotion is a reference to the currently Running
                   promotion.
                 properties:
@@ -1625,8 +1871,47 @@
                         description: |-
                           State stores the state of the promotion process between reconciliation
                           attempts.
                         x-kubernetes-preserve-unknown-fields: true
+                      stepExecutionMetadata:
+                        description: |-
+                          StepExecutionMetadata tracks metadata pertaining to the execution
+                          of individual promotion steps.
+                        items:
+                          description: |-
+                            StepExecutionMetadata tracks metadata pertaining to the execution of
+                            a promotion step.
+                          properties:
+                            alias:
+                              description: Alias is the alias of the step.
+                              type: string
+                            errorCount:
+                              description: ErrorCount tracks consecutive failed attempts
+                                to execute the step.
+                              format: int32
+                              type: integer
+                            finishedAt:
+                              description: |-
+                                FinishedAt is the time at which the final attempt to execute the step
+                                completed.
+                              format: date-time
+                              type: string
+                            message:
+                              description: Message is a display message about the
+                                step, including any errors.
+                              type: string
+                            startedAt:
+                              description: |-
+                                StartedAt is the time at which the first attempt to execute the step
+                                began.
+                              format: date-time
+                              type: string
+                            status:
+                              description: Status is the high-level outcome of the
+                                step.
+                              type: string
+                          type: object
+                        type: array
                     type: object
                 required:
                 - name
                 type: object
@@ -1857,51 +2142,8 @@
                 type: string
               health:
                 description: Health is the Stage's last observed health.
                 properties:
-                  argoCDApps:
-                    description: ArgoCDApps describes the current state of any related
-                      ArgoCD Applications.
-                    items:
-                      description: ArgoCDAppStatus describes the current state of
-                        a single ArgoCD Application.
-                      properties:
-                        healthStatus:
-                          description: HealthStatus is the health of the ArgoCD Application.
-                          properties:
-                            message:
-                              type: string
-                            status:
-                              type: string
-                          required:
-                          - status
-                          type: object
-                        name:
-                          description: Name is the name of the ArgoCD Application.
-                          type: string
-                        namespace:
-                          description: Namespace is the namespace of the ArgoCD Application.
-                          type: string
-                        syncStatus:
-                          description: SyncStatus is the sync status of the ArgoCD
-                            Application.
-                          properties:
-                            revision:
-                              type: string
-                            revisions:
-                              items:
-                                type: string
-                              type: array
-                            status:
-                              type: string
-                          required:
-                          - status
-                          type: object
-                      required:
-                      - name
-                      - namespace
-                      type: object
-                    type: array
                   config:
                     description: |-
                       Config is the opaque configuration of all health checks performed on this
                       Stage.
@@ -2446,8 +2688,47 @@
                         description: |-
                           State stores the state of the promotion process between reconciliation
                           attempts.
                         x-kubernetes-preserve-unknown-fields: true
+                      stepExecutionMetadata:
+                        description: |-
+                          StepExecutionMetadata tracks metadata pertaining to the execution
+                          of individual promotion steps.
+                        items:
+                          description: |-
+                            StepExecutionMetadata tracks metadata pertaining to the execution of
+                            a promotion step.
+                          properties:
+                            alias:
+                              description: Alias is the alias of the step.
+                              type: string
+                            errorCount:
+                              description: ErrorCount tracks consecutive failed attempts
+                                to execute the step.
+                              format: int32
+                              type: integer
+                            finishedAt:
+                              description: |-
+                                FinishedAt is the time at which the final attempt to execute the step
+                                completed.
+                              format: date-time
+                              type: string
+                            message:
+                              description: Message is a display message about the
+                                step, including any errors.
+                              type: string
+                            startedAt:
+                              description: |-
+                                StartedAt is the time at which the first attempt to execute the step
+                                began.
+                              format: date-time
+                              type: string
+                            status:
+                              description: Status is the high-level outcome of the
+                                step.
+                              type: string
+                          type: object
+                        type: array
                     type: object
                 required:
                 - name
                 type: object
@@ -2478,9 +2759,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: warehouses.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -2528,8 +2809,9 @@
                 description: |-
                   FreightCreationPolicy describes how Freight is created by this Warehouse.
                   This field is optional. When left unspecified, the field is implicitly
                   treated as if its value were "Automatic".
+                  Accepted values: Automatic, Manual
                 enum:
                 - Automatic
                 - Manual
                 type: string
@@ -2637,8 +2919,9 @@
                             CommitSelectionStrategy specifies the rules for how to identify the newest
                             commit of interest in the repository specified by the RepoURL field. This
                             field is optional. When left unspecified, the field is implicitly treated
                             as if its value were "NewestFromBranch".
+                            Accepted values: Lexical, NewestFromBranch, NewestTag, SemVer
                           enum:
                           - Lexical
                           - NewestFromBranch
                           - NewestTag
@@ -2782,8 +3065,9 @@
                             ImageSelectionStrategy specifies the rules for how to identify the newest version
                             of the image specified by the RepoURL field. This field is optional. When
                             left unspecified, the field is implicitly treated as if its value were
                             "SemVer".
+                            Accepted values: Digest, Lexical, NewestBuild, SemVer
                           enum:
                           - Digest
                           - Lexical
                           - NewestBuild
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-role-bindings.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-role-bindings.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-role-bindings.yaml	2024-12-09 23:44:45.217276018 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-role-bindings.yaml	2024-12-09 23:44:17.429162696 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-garbage-collector
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-roles.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-roles.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-roles.yaml	2024-12-09 23:44:45.217276018 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-roles.yaml	2024-12-09 23:44:17.429162696 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-garbage-collector
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/configmap.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/configmap.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/configmap.yaml	2024-12-09 23:44:45.216276015 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/configmap.yaml	2024-12-09 23:44:17.428162692 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-garbage-collector
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
 data:
   LOG_LEVEL: "INFO"
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cron-job.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cron-job.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cron-job.yaml	2024-12-09 23:44:45.218276021 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cron-job.yaml	2024-12-09 23:44:17.430162701 +0000
@@ -5,47 +5,59 @@
 metadata:
   name: kargo-garbage-collector
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
 spec:
   schedule: "0 * * * *"
   concurrencyPolicy: Forbid
   jobTemplate:
     metadata:
       labels:
-        helm.sh/chart: kargo-1.0.3
+        helm.sh/chart: kargo-1.1.1
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
-        app.kubernetes.io/version: "v1.0.3"
+        app.kubernetes.io/version: "v1.1.1"
         app.kubernetes.io/managed-by: Helm
         app.kubernetes.io/component: garbage-collector
       annotations:
         configmap/checksum: a825d50984da3ea04b6adc3590a6a9e0490ba058c6a59506bd0620bc09b1dc74
     spec:
       template:
         metadata:
           labels:
-            helm.sh/chart: kargo-1.0.3
+            helm.sh/chart: kargo-1.1.1
             app.kubernetes.io/name: kargo
             app.kubernetes.io/instance: release-name
-            app.kubernetes.io/version: "v1.0.3"
+            app.kubernetes.io/version: "v1.1.1"
             app.kubernetes.io/managed-by: Helm
             app.kubernetes.io/component: garbage-collector
           annotations:
             configmap/checksum: a825d50984da3ea04b6adc3590a6a9e0490ba058c6a59506bd0620bc09b1dc74
         spec:
           serviceAccountName: kargo-garbage-collector
           containers:
           - name: garbage-collector
-            image: ghcr.io/akuity/kargo:v1.0.3
+            image: ghcr.io/akuity/kargo:v1.1.1
             imagePullPolicy: IfNotPresent
-            command: ["/usr/local/bin/kargo", "garbage-collector"]
+            command: ["/sbin/tini", "--", "/usr/local/bin/kargo"]
+            args: ["garbage-collector"]
+            env:
+            - name: GOMEMLIMIT
+              valueFrom:
+                resourceFieldRef:
+                  containerName: garbage-collector
+                  resource: limits.memory
+            - name: GOMAXPROCS
+              valueFrom:
+                resourceFieldRef:
+                  containerName: garbage-collector
+                  resource: limits.cpu
             envFrom:
             - configMapRef:
                 name: kargo-garbage-collector
             resources:
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/service-account.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/service-account.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/service-account.yaml	2024-12-09 23:44:45.216276015 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/garbage-collector/service-account.yaml	2024-12-09 23:44:17.428162692 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-garbage-collector
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-role-bindings.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-role-bindings.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-role-bindings.yaml	2024-12-09 23:44:45.217276018 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-role-bindings.yaml	2024-12-09 23:44:17.429162696 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-management-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-roles.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-roles.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-roles.yaml	2024-12-09 23:44:45.217276018 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-roles.yaml	2024-12-09 23:44:17.429162696 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-management-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/configmap.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/configmap.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/configmap.yaml	2024-12-09 23:44:45.216276015 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/configmap.yaml	2024-12-09 23:44:17.428162692 +0000
@@ -5,13 +5,16 @@
 metadata:
   name: kargo-management-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
 data:
   KARGO_NAMESPACE: default
   LOG_LEVEL: "INFO"
+  MAX_CONCURRENT_NAMESPACE_RECONCILES: "4"
+  MAX_CONCURRENT_PROJECT_RECONCILES: "4"
+  MAX_CONCURRENT_SERVICE_ACCOUNT_RECONCILES: "4"
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/deployment.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/deployment.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/deployment.yaml	2024-12-09 23:44:45.218276021 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/deployment.yaml	2024-12-09 23:44:17.430162701 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-management-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
 spec:
   replicas: 1
@@ -27,16 +27,28 @@
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
         app.kubernetes.io/component: management-controller
       annotations:
-        configmap/checksum: f12f16e41a5ad2eafe250dc88ee5bbb12da69eef9a24cdd7fe31d77b4af02ef0
+        configmap/checksum: bcf468b0c814c0cda7c1733b1393de92d5d51cfc38ed6b66c2891b895d9071ff
     spec:
       serviceAccount: kargo-management-controller
       containers:
       - name: management-controller
-        image: ghcr.io/akuity/kargo:v1.0.3
+        image: ghcr.io/akuity/kargo:v1.1.1
         imagePullPolicy: IfNotPresent
-        command: ["/usr/local/bin/kargo", "management-controller"]
+        command: ["/sbin/tini", "--", "/usr/local/bin/kargo"]
+        args: ["management-controller"]
+        env:
+        - name: GOMEMLIMIT
+          valueFrom:
+            resourceFieldRef:
+              containerName: management-controller
+              resource: limits.memory
+        - name: GOMAXPROCS
+          valueFrom:
+            resourceFieldRef:
+              containerName: management-controller
+              resource: limits.cpu
         envFrom:
         - configMapRef:
             name: kargo-management-controller
         resources:
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/service-account.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/service-account.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/service-account.yaml	2024-12-09 23:44:45.216276015 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/management-controller/service-account.yaml	2024-12-09 23:44:17.428162692 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-management-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/users/cluster-role-bindings.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/users/cluster-role-bindings.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/users/cluster-role-bindings.yaml	2024-12-09 23:44:45.217276018 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/users/cluster-role-bindings.yaml	2024-12-09 23:44:17.429162696 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-admin
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
@@ -24,12 +24,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-viewer
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/users/cluster-roles.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/users/cluster-roles.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/users/cluster-roles.yaml	2024-12-09 23:44:45.217276018 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/users/cluster-roles.yaml	2024-12-09 23:44:17.429162696 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-admin
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
 rules:
 - apiGroups:
   - ""
@@ -84,12 +84,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-viewer
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
 rules:
 - apiGroups:
   - ""
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/users/service-accounts.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/users/service-accounts.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/users/service-accounts.yaml	2024-12-09 23:44:45.216276015 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/users/service-accounts.yaml	2024-12-09 23:44:17.428162692 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-admin
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
 ---
 # Source: sx-kargo/charts/kargo/templates/users/service-accounts.yaml
 apiVersion: v1
@@ -18,9 +18,9 @@
 metadata:
   name: kargo-viewer
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks/webhooks.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks/webhooks.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks/webhooks.yaml	2024-12-09 23:44:45.218276021 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks/webhooks.yaml	2024-12-09 23:44:17.430162701 +0000
@@ -4,12 +4,12 @@
 kind: MutatingWebhookConfiguration
 metadata:
   name: kargo
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
   annotations:
     cert-manager.io/inject-ca-from: default/kargo-webhooks-server
@@ -80,12 +80,12 @@
 kind: ValidatingWebhookConfiguration
 metadata:
   name: kargo
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
   annotations:
     cert-manager.io/inject-ca-from: default/kargo-webhooks-server
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role-binding.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role-binding.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role-binding.yaml	2024-12-09 23:44:45.218276021 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role-binding.yaml	2024-12-09 23:44:17.430162701 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-webhooks-server
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -25,12 +25,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-webhooks-server-ns-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -46,12 +46,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-webhooks-server-generic-gc
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role.yaml	2024-12-09 23:44:45.217276018 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role.yaml	2024-12-09 23:44:17.429162696 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-webhooks-server
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 rules:
 - apiGroups:
@@ -79,12 +79,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-webhooks-server-ns-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 rules:
 - apiGroups:
@@ -105,12 +105,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-webhooks-server-generic-gc
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/configmap.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/configmap.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/configmap.yaml	2024-12-09 23:44:45.216276015 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/configmap.yaml	2024-12-09 23:44:17.428162692 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-webhooks-server
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 data:
   KARGO_NAMESPACE: default
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/deployment.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/deployment.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/deployment.yaml	2024-12-09 23:44:45.218276021 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/deployment.yaml	2024-12-09 23:44:17.430162701 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-webhooks-server
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 spec:
   replicas: 1
@@ -23,23 +23,35 @@
       app.kubernetes.io/component: webhooks-server
   template:
     metadata:
       labels:
-        helm.sh/chart: kargo-1.0.3
+        helm.sh/chart: kargo-1.1.1
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
-        app.kubernetes.io/version: "v1.0.3"
+        app.kubernetes.io/version: "v1.1.1"
         app.kubernetes.io/managed-by: Helm
         app.kubernetes.io/component: webhooks-server
       annotations:
         configmap/checksum: 517e77c4dd49419d768a458d24a72e747c19a23a0eb5f022b3fe25fd49dd5a7c
     spec:
       serviceAccount: kargo-webhooks-server
       containers:
       - name: webhooks-server
-        image: ghcr.io/akuity/kargo:v1.0.3
+        image: ghcr.io/akuity/kargo:v1.1.1
         imagePullPolicy: IfNotPresent
-        command: ["/usr/local/bin/kargo", "webhooks-server"]
+        command: ["/sbin/tini", "--", "/usr/local/bin/kargo"]
+        args: ["webhooks-server"]
+        env:
+        - name: GOMEMLIMIT
+          valueFrom:
+            resourceFieldRef:
+              containerName: webhooks-server
+              resource: limits.memory
+        - name: GOMAXPROCS
+          valueFrom:
+            resourceFieldRef:
+              containerName: webhooks-server
+              resource: limits.cpu
         envFrom:
         - configMapRef:
             name: kargo-webhooks-server
         ports:
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service-account.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service-account.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service-account.yaml	2024-12-09 23:44:45.216276015 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service-account.yaml	2024-12-09 23:44:17.428162692 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-webhooks-server
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
diff -U 4 -r out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service.yaml out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service.yaml
--- out/target/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service.yaml	2024-12-09 23:44:45.218276021 +0000
+++ out/pr/kargo/values-k3d.yaml/sx-kargo/charts/kargo/templates/webhooks-server/service.yaml	2024-12-09 23:44:17.430162701 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-webhooks-server
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 spec:
   type: ClusterIP
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/cluster-role-binding.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/cluster-role-binding.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/cluster-role-binding.yaml	2024-12-09 23:44:45.476276802 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/cluster-role-binding.yaml	2024-12-09 23:44:17.697163812 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-api
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -25,12 +25,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-api-rollouts
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/cluster-role.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/cluster-role.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/cluster-role.yaml	2024-12-09 23:44:45.476276802 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/cluster-role.yaml	2024-12-09 23:44:17.697163812 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-api
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 rules:
   - apiGroups:
@@ -129,12 +129,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-project-admin
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 rules:
 - apiGroups:
@@ -158,12 +158,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-api-rollouts
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/configmap.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/configmap.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/configmap.yaml	2024-12-09 23:44:45.475276799 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/configmap.yaml	2024-12-09 23:44:17.696163808 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 data:
   KARGO_NAMESPACE: default
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/deployment.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/deployment.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/deployment.yaml	2024-12-09 23:44:45.477276805 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/deployment.yaml	2024-12-09 23:44:17.698163817 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 spec:
   replicas: 1
@@ -23,12 +23,12 @@
       app.kubernetes.io/component: api
   template:
     metadata:
       labels:
-        helm.sh/chart: kargo-1.0.3
+        helm.sh/chart: kargo-1.1.1
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
-        app.kubernetes.io/version: "v1.0.3"
+        app.kubernetes.io/version: "v1.1.1"
         app.kubernetes.io/managed-by: Helm
         app.kubernetes.io/component: api
       annotations:
         configmap/checksum: 6aa8d2b5c0777debaaf7638d702c68a2a4d5ebbe594cf72cb73dca90ec719176
@@ -36,11 +36,22 @@
     spec:
       serviceAccount: kargo-api
       containers:
         - name: api
-          image: ghcr.io/akuity/kargo:v1.0.3
+          image: ghcr.io/akuity/kargo:v1.1.1
           imagePullPolicy: IfNotPresent
           command: ["/usr/local/bin/kargo", "api"]
+          env:
+          - name: GOMEMLIMIT
+            valueFrom:
+              resourceFieldRef:
+                containerName: api
+                resource: limits.memory
+          - name: GOMAXPROCS
+            valueFrom:
+              resourceFieldRef:
+                containerName: api
+                resource: limits.cpu
           envFrom:
           - configMapRef:
               name: kargo-api
           - secretRef:
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/ingress.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/ingress.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/ingress.yaml	2024-12-09 23:44:45.477276805 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/ingress.yaml	2024-12-09 23:44:17.698163817 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
   annotations:
     cert-manager.io/cluster-issuer: "letsencrypt-staging"
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/secret.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/secret.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/secret.yaml	2024-12-09 23:44:45.475276799 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/secret.yaml	2024-12-09 23:44:17.696163808 +0000
@@ -6,12 +6,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 stringData:  
   ADMIN_ACCOUNT_PASSWORD_HASH: "$2y$10$7FtRo..bKM5qcrp8dv.7f.TDAQLRSge47Dpi8sLM4sWbWqd9kQAha"  
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/service-account.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/service-account.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/service-account.yaml	2024-12-09 23:44:45.475276799 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/service-account.yaml	2024-12-09 23:44:17.696163808 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/service.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/service.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/service.yaml	2024-12-09 23:44:45.477276805 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/api/service.yaml	2024-12-09 23:44:17.698163817 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-api
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: api
 spec:
   type: ClusterIP
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/cluster-role-bindings.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/cluster-role-bindings.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/cluster-role-bindings.yaml	2024-12-09 23:44:45.476276802 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/cluster-role-bindings.yaml	2024-12-09 23:44:17.697163812 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -25,12 +25,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-controller-argocd
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -46,12 +46,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-controller-rollouts
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/cluster-roles.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/cluster-roles.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/cluster-roles.yaml	2024-12-09 23:44:45.476276802 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/cluster-roles.yaml	2024-12-09 23:44:17.697163812 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 rules:
 - apiGroups:
@@ -71,12 +71,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-controller-read-secrets
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 rules:
 - apiGroups:
@@ -93,12 +93,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-controller-argocd
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 rules:
 - apiGroups:
@@ -116,12 +116,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-controller-rollouts
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/configmap.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/configmap.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/configmap.yaml	2024-12-09 23:44:45.475276799 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/configmap.yaml	2024-12-09 23:44:17.696163808 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 data:
   API_SERVER_BASE_URL: https://kargo-metalstack.platform-engineer.cloud
@@ -23,4 +23,8 @@
   ARGOCD_NAMESPACE: argocd
   ARGOCD_WATCH_ARGOCD_NAMESPACE_ONLY: "false"
   ROLLOUTS_INTEGRATION_ENABLED: "true"
   ROLLOUTS_CONTROLLER_INSTANCE_ID: ""
+  MAX_CONCURRENT_CONTROL_FLOW_RECONCILES: "4"
+  MAX_CONCURRENT_PROMOTION_RECONCILES: "4"
+  MAX_CONCURRENT_STAGE_RECONCILES: "4"
+  MAX_CONCURRENT_WAREHOUSE_RECONCILES: "4"
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/deployment.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/deployment.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/deployment.yaml	2024-12-09 23:44:45.477276805 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/deployment.yaml	2024-12-09 23:44:17.698163817 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
 spec:
   replicas: 1
@@ -23,23 +23,35 @@
       app.kubernetes.io/component: controller
   template:
     metadata:
       labels:
-        helm.sh/chart: kargo-1.0.3
+        helm.sh/chart: kargo-1.1.1
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
-        app.kubernetes.io/version: "v1.0.3"
+        app.kubernetes.io/version: "v1.1.1"
         app.kubernetes.io/managed-by: Helm
         app.kubernetes.io/component: controller
       annotations:
-        configmap/checksum: d9c19ab0d44a0cdd12dd6a183ecb42af83959e4801c58fb00bf9cd9decb46481
+        configmap/checksum: 64e2f78e50a4bbb4cf7c553e3d4b078e24ef976dce3d291ad1275cd41b91dc3f
     spec:
       serviceAccount: kargo-controller
       containers:
       - name: controller
-        image: ghcr.io/akuity/kargo:v1.0.3
+        image: ghcr.io/akuity/kargo:v1.1.1
         imagePullPolicy: IfNotPresent
-        command: ["/usr/local/bin/kargo", "controller"]
+        command: ["/sbin/tini", "--", "/usr/local/bin/kargo"]
+        args: ["controller"]
+        env:
+        - name: GOMEMLIMIT
+          valueFrom:
+            resourceFieldRef:
+              containerName: controller
+              resource: limits.memory
+        - name: GOMAXPROCS
+          valueFrom:
+            resourceFieldRef:
+              containerName: controller
+              resource: limits.cpu
         envFrom:
         - configMapRef:
             name: kargo-controller
         resources:
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/service-account.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/service-account.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/service-account.yaml	2024-12-09 23:44:45.475276799 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/controller/service-account.yaml	2024-12-09 23:44:17.696163808 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller

Copy link
Contributor

github-actions bot commented Dec 9, 2024

Changes Rendered Chart
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/crds.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/crds.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/crds.yaml	2024-12-09 23:44:45.476276802 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/crds.yaml	2024-12-09 23:44:17.697163812 +0000
@@ -3,9 +3,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: freights.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -205,9 +205,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: projects.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -373,9 +373,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: promotions.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -460,10 +460,58 @@
                     as:
                       description: As is the alias this step can be referred to as.
                       type: string
                     config:
-                      description: Config is the configuration for the directive.
+                      description: |-
+                        Config is opaque configuration for the PromotionStep that is understood
+                        only by each PromotionStep's implementation. It is legal to utilize
+                        expressions in defining values at any level of this block.
+                        See https://docs.kargo.io/references/expression-language for details.
                       x-kubernetes-preserve-unknown-fields: true
+                    retry:
+                      description: Retry is the retry policy for this step.
+                      properties:
+                        errorThreshold:
+                          description: |-
+                            ErrorThreshold is the number of consecutive times the step must fail (for
+                            any reason) before retries are abandoned and the entire Promotion is marked
+                            as failed.
+
+                            If this field is set to 0, the effective default will be a step-specific
+                            one. If no step-specific default exists (i.e. is also 0), the effective
+                            default will be the system-wide default of 1.
+
+                            A value of 1 will cause the Promotion to be marked as failed after just
+                            a single failure; i.e. no retries will be attempted.
+
+                            There is no option to specify an infinite number of retries using a value
+                            such as -1.
+
+                            In a future release, Kargo is likely to become capable of distinguishing
+                            between recoverable and non-recoverable step failures. At that time, it is
+                            planned that unrecoverable failures will not be subject to this threshold
+                            and will immediately cause the Promotion to be marked as failed without
+                            further condition.
+                          format: int32
+                          type: integer
+                        timeout:
+                          description: |-
+                            Timeout is the soft maximum interval in which a step that returns a Running
+                            status (which typically indicates it's waiting for something to happen)
+                            may be retried.
+
+                            The maximum is a soft one because the check for whether the interval has
+                            elapsed occurs AFTER the step has run. This effectively means a step may
+                            run ONCE beyond the close of the interval.
+
+                            If this field is set to nil, the effective default will be a step-specific
+                            one. If no step-specific default exists (i.e. is also nil), the effective
+                            default will be the system-wide default of 0.
+
+                            A value of 0 will cause the step to be retried indefinitely unless the
+                            ErrorThreshold is reached.
+                          type: string
+                      type: object
                     uses:
                       description: Uses identifies a runner that can execute this
                         step.
                       minLength: 1
@@ -471,8 +519,33 @@
                   required:
                   - uses
                   type: object
                 type: array
+              vars:
+                description: |-
+                  Vars is a list of variables that can be referenced by expressions in
+                  promotion steps.
+                items:
+                  description: |-
+                    PromotionVariable describes a single variable that may be referenced by
+                    expressions in promotion steps.
+                  properties:
+                    name:
+                      description: Name is the name of the variable.
+                      minLength: 1
+                      pattern: ^[a-zA-Z_]\w*$
+                      type: string
+                    value:
+                      description: |-
+                        Value is the value of the variable. It is allowed to utilize expressions
+                        in the value.
+                        See https://docs.kargo.io/references/expression-language for details.
+                      type: string
+                  required:
+                  - name
+                  - value
+                  type: object
+                type: array
             required:
             - freight
             - stage
             type: object
@@ -857,8 +930,46 @@
                 description: |-
                   State stores the state of the promotion process between reconciliation
                   attempts.
                 x-kubernetes-preserve-unknown-fields: true
+              stepExecutionMetadata:
+                description: |-
+                  StepExecutionMetadata tracks metadata pertaining to the execution
+                  of individual promotion steps.
+                items:
+                  description: |-
+                    StepExecutionMetadata tracks metadata pertaining to the execution of
+                    a promotion step.
+                  properties:
+                    alias:
+                      description: Alias is the alias of the step.
+                      type: string
+                    errorCount:
+                      description: ErrorCount tracks consecutive failed attempts to
+                        execute the step.
+                      format: int32
+                      type: integer
+                    finishedAt:
+                      description: |-
+                        FinishedAt is the time at which the final attempt to execute the step
+                        completed.
+                      format: date-time
+                      type: string
+                    message:
+                      description: Message is a display message about the step, including
+                        any errors.
+                      type: string
+                    startedAt:
+                      description: |-
+                        StartedAt is the time at which the first attempt to execute the step
+                        began.
+                      format: date-time
+                      type: string
+                    status:
+                      description: Status is the high-level outcome of the step.
+                      type: string
+                  type: object
+                type: array
             type: object
         required:
         - spec
         type: object
@@ -871,9 +982,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: stages.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -951,10 +1062,58 @@
                               description: As is the alias this step can be referred
                                 to as.
                               type: string
                             config:
-                              description: Config is the configuration for the directive.
+                              description: |-
+                                Config is opaque configuration for the PromotionStep that is understood
+                                only by each PromotionStep's implementation. It is legal to utilize
+                                expressions in defining values at any level of this block.
+                                See https://docs.kargo.io/references/expression-language for details.
                               x-kubernetes-preserve-unknown-fields: true
+                            retry:
+                              description: Retry is the retry policy for this step.
+                              properties:
+                                errorThreshold:
+                                  description: |-
+                                    ErrorThreshold is the number of consecutive times the step must fail (for
+                                    any reason) before retries are abandoned and the entire Promotion is marked
+                                    as failed.
+
+                                    If this field is set to 0, the effective default will be a step-specific
+                                    one. If no step-specific default exists (i.e. is also 0), the effective
+                                    default will be the system-wide default of 1.
+
+                                    A value of 1 will cause the Promotion to be marked as failed after just
+                                    a single failure; i.e. no retries will be attempted.
+
+                                    There is no option to specify an infinite number of retries using a value
+                                    such as -1.
+
+                                    In a future release, Kargo is likely to become capable of distinguishing
+                                    between recoverable and non-recoverable step failures. At that time, it is
+                                    planned that unrecoverable failures will not be subject to this threshold
+                                    and will immediately cause the Promotion to be marked as failed without
+                                    further condition.
+                                  format: int32
+                                  type: integer
+                                timeout:
+                                  description: |-
+                                    Timeout is the soft maximum interval in which a step that returns a Running
+                                    status (which typically indicates it's waiting for something to happen)
+                                    may be retried.
+
+                                    The maximum is a soft one because the check for whether the interval has
+                                    elapsed occurs AFTER the step has run. This effectively means a step may
+                                    run ONCE beyond the close of the interval.
+
+                                    If this field is set to nil, the effective default will be a step-specific
+                                    one. If no step-specific default exists (i.e. is also nil), the effective
+                                    default will be the system-wide default of 0.
+
+                                    A value of 0 will cause the step to be retried indefinitely unless the
+                                    ErrorThreshold is reached.
+                                  type: string
+                              type: object
                             uses:
                               description: Uses identifies a runner that can execute
                                 this step.
                               minLength: 1
@@ -963,8 +1122,33 @@
                           - uses
                           type: object
                         minItems: 1
                         type: array
+                      vars:
+                        description: |-
+                          Vars is a list of variables that can be referenced by expressions in
+                          promotion steps.
+                        items:
+                          description: |-
+                            PromotionVariable describes a single variable that may be referenced by
+                            expressions in promotion steps.
+                          properties:
+                            name:
+                              description: Name is the name of the variable.
+                              minLength: 1
+                              pattern: ^[a-zA-Z_]\w*$
+                              type: string
+                            value:
+                              description: |-
+                                Value is the value of the variable. It is allowed to utilize expressions
+                                in the value.
+                                See https://docs.kargo.io/references/expression-language for details.
+                              type: string
+                          required:
+                          - name
+                          - value
+                          type: object
+                        type: array
                     type: object
                 required:
                 - spec
                 type: object
@@ -1104,8 +1288,70 @@
           status:
             description: Status describes the Stage's current and recent Freight,
               health, and more.
             properties:
+              conditions:
+                description: |-
+                  Conditions contains the last observations of the Stage's current
+                  state.
+                items:
+                  description: Condition contains details for one aspect of the current
+                    state of this API Resource.
+                  properties:
+                    lastTransitionTime:
+                      description: |-
+                        lastTransitionTime is the last time the condition transitioned from one status to another.
+                        This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.
+                      format: date-time
+                      type: string
+                    message:
+                      description: |-
+                        message is a human readable message indicating details about the transition.
+                        This may be an empty string.
+                      maxLength: 32768
+                      type: string
+                    observedGeneration:
+                      description: |-
+                        observedGeneration represents the .metadata.generation that the condition was set based upon.
+                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date
+                        with respect to the current state of the instance.
+                      format: int64
+                      minimum: 0
+                      type: integer
+                    reason:
+                      description: |-
+                        reason contains a programmatic identifier indicating the reason for the condition's last transition.
+                        Producers of specific condition types may define expected values and meanings for this field,
+                        and whether the values are considered a guaranteed API.
+                        The value should be a CamelCase string.
+                        This field may not be empty.
+                      maxLength: 1024
+                      minLength: 1
+                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
+                      type: string
+                    status:
+                      description: status of the condition, one of True, False, Unknown.
+                      enum:
+                      - "True"
+                      - "False"
+                      - Unknown
+                      type: string
+                    type:
+                      description: type of condition in CamelCase or in foo.example.com/CamelCase.
+                      maxLength: 316
+                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
+                      type: string
+                  required:
+                  - lastTransitionTime
+                  - message
+                  - reason
+                  - status
+                  - type
+                  type: object
+                type: array
+                x-kubernetes-list-map-keys:
+                - type
+                x-kubernetes-list-type: map
               currentPromotion:
                 description: CurrentPromotion is a reference to the currently Running
                   promotion.
                 properties:
@@ -1625,8 +1871,47 @@
                         description: |-
                           State stores the state of the promotion process between reconciliation
                           attempts.
                         x-kubernetes-preserve-unknown-fields: true
+                      stepExecutionMetadata:
+                        description: |-
+                          StepExecutionMetadata tracks metadata pertaining to the execution
+                          of individual promotion steps.
+                        items:
+                          description: |-
+                            StepExecutionMetadata tracks metadata pertaining to the execution of
+                            a promotion step.
+                          properties:
+                            alias:
+                              description: Alias is the alias of the step.
+                              type: string
+                            errorCount:
+                              description: ErrorCount tracks consecutive failed attempts
+                                to execute the step.
+                              format: int32
+                              type: integer
+                            finishedAt:
+                              description: |-
+                                FinishedAt is the time at which the final attempt to execute the step
+                                completed.
+                              format: date-time
+                              type: string
+                            message:
+                              description: Message is a display message about the
+                                step, including any errors.
+                              type: string
+                            startedAt:
+                              description: |-
+                                StartedAt is the time at which the first attempt to execute the step
+                                began.
+                              format: date-time
+                              type: string
+                            status:
+                              description: Status is the high-level outcome of the
+                                step.
+                              type: string
+                          type: object
+                        type: array
                     type: object
                 required:
                 - name
                 type: object
@@ -1857,51 +2142,8 @@
                 type: string
               health:
                 description: Health is the Stage's last observed health.
                 properties:
-                  argoCDApps:
-                    description: ArgoCDApps describes the current state of any related
-                      ArgoCD Applications.
-                    items:
-                      description: ArgoCDAppStatus describes the current state of
-                        a single ArgoCD Application.
-                      properties:
-                        healthStatus:
-                          description: HealthStatus is the health of the ArgoCD Application.
-                          properties:
-                            message:
-                              type: string
-                            status:
-                              type: string
-                          required:
-                          - status
-                          type: object
-                        name:
-                          description: Name is the name of the ArgoCD Application.
-                          type: string
-                        namespace:
-                          description: Namespace is the namespace of the ArgoCD Application.
-                          type: string
-                        syncStatus:
-                          description: SyncStatus is the sync status of the ArgoCD
-                            Application.
-                          properties:
-                            revision:
-                              type: string
-                            revisions:
-                              items:
-                                type: string
-                              type: array
-                            status:
-                              type: string
-                          required:
-                          - status
-                          type: object
-                      required:
-                      - name
-                      - namespace
-                      type: object
-                    type: array
                   config:
                     description: |-
                       Config is the opaque configuration of all health checks performed on this
                       Stage.
@@ -2446,8 +2688,47 @@
                         description: |-
                           State stores the state of the promotion process between reconciliation
                           attempts.
                         x-kubernetes-preserve-unknown-fields: true
+                      stepExecutionMetadata:
+                        description: |-
+                          StepExecutionMetadata tracks metadata pertaining to the execution
+                          of individual promotion steps.
+                        items:
+                          description: |-
+                            StepExecutionMetadata tracks metadata pertaining to the execution of
+                            a promotion step.
+                          properties:
+                            alias:
+                              description: Alias is the alias of the step.
+                              type: string
+                            errorCount:
+                              description: ErrorCount tracks consecutive failed attempts
+                                to execute the step.
+                              format: int32
+                              type: integer
+                            finishedAt:
+                              description: |-
+                                FinishedAt is the time at which the final attempt to execute the step
+                                completed.
+                              format: date-time
+                              type: string
+                            message:
+                              description: Message is a display message about the
+                                step, including any errors.
+                              type: string
+                            startedAt:
+                              description: |-
+                                StartedAt is the time at which the first attempt to execute the step
+                                began.
+                              format: date-time
+                              type: string
+                            status:
+                              description: Status is the high-level outcome of the
+                                step.
+                              type: string
+                          type: object
+                        type: array
                     type: object
                 required:
                 - name
                 type: object
@@ -2478,9 +2759,9 @@
 apiVersion: apiextensions.k8s.io/v1
 kind: CustomResourceDefinition
 metadata:
   annotations:
-    controller-gen.kubebuilder.io/version: v0.16.3
+    controller-gen.kubebuilder.io/version: v0.16.5
     helm.sh/resource-policy: keep
   name: warehouses.kargo.akuity.io
 spec:
   group: kargo.akuity.io
@@ -2528,8 +2809,9 @@
                 description: |-
                   FreightCreationPolicy describes how Freight is created by this Warehouse.
                   This field is optional. When left unspecified, the field is implicitly
                   treated as if its value were "Automatic".
+                  Accepted values: Automatic, Manual
                 enum:
                 - Automatic
                 - Manual
                 type: string
@@ -2637,8 +2919,9 @@
                             CommitSelectionStrategy specifies the rules for how to identify the newest
                             commit of interest in the repository specified by the RepoURL field. This
                             field is optional. When left unspecified, the field is implicitly treated
                             as if its value were "NewestFromBranch".
+                            Accepted values: Lexical, NewestFromBranch, NewestTag, SemVer
                           enum:
                           - Lexical
                           - NewestFromBranch
                           - NewestTag
@@ -2782,8 +3065,9 @@
                             ImageSelectionStrategy specifies the rules for how to identify the newest version
                             of the image specified by the RepoURL field. This field is optional. When
                             left unspecified, the field is implicitly treated as if its value were
                             "SemVer".
+                            Accepted values: Digest, Lexical, NewestBuild, SemVer
                           enum:
                           - Digest
                           - Lexical
                           - NewestBuild
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-role-bindings.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-role-bindings.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-role-bindings.yaml	2024-12-09 23:44:45.476276802 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-role-bindings.yaml	2024-12-09 23:44:17.698163817 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-garbage-collector
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-roles.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-roles.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-roles.yaml	2024-12-09 23:44:45.476276802 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cluster-roles.yaml	2024-12-09 23:44:17.697163812 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-garbage-collector
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/configmap.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/configmap.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/configmap.yaml	2024-12-09 23:44:45.475276799 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/configmap.yaml	2024-12-09 23:44:17.696163808 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-garbage-collector
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
 data:
   LOG_LEVEL: "INFO"
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cron-job.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cron-job.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cron-job.yaml	2024-12-09 23:44:45.477276805 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/cron-job.yaml	2024-12-09 23:44:17.698163817 +0000
@@ -5,47 +5,59 @@
 metadata:
   name: kargo-garbage-collector
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
 spec:
   schedule: "0 * * * *"
   concurrencyPolicy: Forbid
   jobTemplate:
     metadata:
       labels:
-        helm.sh/chart: kargo-1.0.3
+        helm.sh/chart: kargo-1.1.1
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
-        app.kubernetes.io/version: "v1.0.3"
+        app.kubernetes.io/version: "v1.1.1"
         app.kubernetes.io/managed-by: Helm
         app.kubernetes.io/component: garbage-collector
       annotations:
         configmap/checksum: a825d50984da3ea04b6adc3590a6a9e0490ba058c6a59506bd0620bc09b1dc74
     spec:
       template:
         metadata:
           labels:
-            helm.sh/chart: kargo-1.0.3
+            helm.sh/chart: kargo-1.1.1
             app.kubernetes.io/name: kargo
             app.kubernetes.io/instance: release-name
-            app.kubernetes.io/version: "v1.0.3"
+            app.kubernetes.io/version: "v1.1.1"
             app.kubernetes.io/managed-by: Helm
             app.kubernetes.io/component: garbage-collector
           annotations:
             configmap/checksum: a825d50984da3ea04b6adc3590a6a9e0490ba058c6a59506bd0620bc09b1dc74
         spec:
           serviceAccountName: kargo-garbage-collector
           containers:
           - name: garbage-collector
-            image: ghcr.io/akuity/kargo:v1.0.3
+            image: ghcr.io/akuity/kargo:v1.1.1
             imagePullPolicy: IfNotPresent
-            command: ["/usr/local/bin/kargo", "garbage-collector"]
+            command: ["/sbin/tini", "--", "/usr/local/bin/kargo"]
+            args: ["garbage-collector"]
+            env:
+            - name: GOMEMLIMIT
+              valueFrom:
+                resourceFieldRef:
+                  containerName: garbage-collector
+                  resource: limits.memory
+            - name: GOMAXPROCS
+              valueFrom:
+                resourceFieldRef:
+                  containerName: garbage-collector
+                  resource: limits.cpu
             envFrom:
             - configMapRef:
                 name: kargo-garbage-collector
             resources:
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/service-account.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/service-account.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/service-account.yaml	2024-12-09 23:44:45.475276799 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/garbage-collector/service-account.yaml	2024-12-09 23:44:17.696163808 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-garbage-collector
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: garbage-collector
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-role-bindings.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-role-bindings.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-role-bindings.yaml	2024-12-09 23:44:45.476276802 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-role-bindings.yaml	2024-12-09 23:44:17.698163817 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-management-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-roles.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-roles.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-roles.yaml	2024-12-09 23:44:45.476276802 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/cluster-roles.yaml	2024-12-09 23:44:17.697163812 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-management-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/configmap.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/configmap.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/configmap.yaml	2024-12-09 23:44:45.475276799 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/configmap.yaml	2024-12-09 23:44:17.696163808 +0000
@@ -5,13 +5,16 @@
 metadata:
   name: kargo-management-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
 data:
   KARGO_NAMESPACE: default
   LOG_LEVEL: "INFO"
+  MAX_CONCURRENT_NAMESPACE_RECONCILES: "4"
+  MAX_CONCURRENT_PROJECT_RECONCILES: "4"
+  MAX_CONCURRENT_SERVICE_ACCOUNT_RECONCILES: "4"
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/deployment.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/deployment.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/deployment.yaml	2024-12-09 23:44:45.477276805 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/deployment.yaml	2024-12-09 23:44:17.698163817 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-management-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
 spec:
   replicas: 1
@@ -27,16 +27,28 @@
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
         app.kubernetes.io/component: management-controller
       annotations:
-        configmap/checksum: f12f16e41a5ad2eafe250dc88ee5bbb12da69eef9a24cdd7fe31d77b4af02ef0
+        configmap/checksum: bcf468b0c814c0cda7c1733b1393de92d5d51cfc38ed6b66c2891b895d9071ff
     spec:
       serviceAccount: kargo-management-controller
       containers:
       - name: management-controller
-        image: ghcr.io/akuity/kargo:v1.0.3
+        image: ghcr.io/akuity/kargo:v1.1.1
         imagePullPolicy: IfNotPresent
-        command: ["/usr/local/bin/kargo", "management-controller"]
+        command: ["/sbin/tini", "--", "/usr/local/bin/kargo"]
+        args: ["management-controller"]
+        env:
+        - name: GOMEMLIMIT
+          valueFrom:
+            resourceFieldRef:
+              containerName: management-controller
+              resource: limits.memory
+        - name: GOMAXPROCS
+          valueFrom:
+            resourceFieldRef:
+              containerName: management-controller
+              resource: limits.cpu
         envFrom:
         - configMapRef:
             name: kargo-management-controller
         resources:
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/service-account.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/service-account.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/service-account.yaml	2024-12-09 23:44:45.475276799 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/management-controller/service-account.yaml	2024-12-09 23:44:17.696163808 +0000
@@ -5,10 +5,10 @@
 metadata:
   name: kargo-management-controller
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: management-controller
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/users/cluster-role-bindings.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/users/cluster-role-bindings.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/users/cluster-role-bindings.yaml	2024-12-09 23:44:45.477276805 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/users/cluster-role-bindings.yaml	2024-12-09 23:44:17.698163817 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-admin
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
@@ -24,12 +24,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-viewer
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/users/cluster-roles.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/users/cluster-roles.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/users/cluster-roles.yaml	2024-12-09 23:44:45.476276802 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/users/cluster-roles.yaml	2024-12-09 23:44:17.697163812 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-admin
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
 rules:
 - apiGroups:
   - ""
@@ -84,12 +84,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-viewer
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
 rules:
 - apiGroups:
   - ""
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/users/service-accounts.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/users/service-accounts.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/users/service-accounts.yaml	2024-12-09 23:44:45.475276799 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/users/service-accounts.yaml	2024-12-09 23:44:17.696163808 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-admin
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
 ---
 # Source: sx-kargo/charts/kargo/templates/users/service-accounts.yaml
 apiVersion: v1
@@ -18,9 +18,9 @@
 metadata:
   name: kargo-viewer
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks/webhooks.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks/webhooks.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks/webhooks.yaml	2024-12-09 23:44:45.477276805 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks/webhooks.yaml	2024-12-09 23:44:17.699163821 +0000
@@ -4,12 +4,12 @@
 kind: MutatingWebhookConfiguration
 metadata:
   name: kargo
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
   annotations:
     cert-manager.io/inject-ca-from: default/kargo-webhooks-server
@@ -80,12 +80,12 @@
 kind: ValidatingWebhookConfiguration
 metadata:
   name: kargo
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: controller
   annotations:
     cert-manager.io/inject-ca-from: default/kargo-webhooks-server
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role-binding.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role-binding.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role-binding.yaml	2024-12-09 23:44:45.477276805 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role-binding.yaml	2024-12-09 23:44:17.698163817 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-webhooks-server
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -25,12 +25,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-webhooks-server-ns-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 roleRef:
   apiGroup: rbac.authorization.k8s.io
@@ -46,12 +46,12 @@
 kind: ClusterRoleBinding
 metadata:
   name: kargo-webhooks-server-generic-gc
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role.yaml	2024-12-09 23:44:45.476276802 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/cluster-role.yaml	2024-12-09 23:44:17.697163812 +0000
@@ -4,12 +4,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-webhooks-server
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 rules:
 - apiGroups:
@@ -79,12 +79,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-webhooks-server-ns-controller
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 rules:
 - apiGroups:
@@ -105,12 +105,12 @@
 kind: ClusterRole
 metadata:
   name: kargo-webhooks-server-generic-gc
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 rules:
 - apiGroups:
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/configmap.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/configmap.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/configmap.yaml	2024-12-09 23:44:45.475276799 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/configmap.yaml	2024-12-09 23:44:17.696163808 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-webhooks-server
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 data:
   KARGO_NAMESPACE: default
diff -U 4 -r out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/deployment.yaml out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/deployment.yaml
--- out/target/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/deployment.yaml	2024-12-09 23:44:45.477276805 +0000
+++ out/pr/kargo/values-metalstack.yaml/sx-kargo/charts/kargo/templates/webhooks-server/deployment.yaml	2024-12-09 23:44:17.698163817 +0000
@@ -5,12 +5,12 @@
 metadata:
   name: kargo-webhooks-server
   namespace: default
   labels:
-    helm.sh/chart: kargo-1.0.3
+    helm.sh/chart: kargo-1.1.1
     app.kubernetes.io/name: kargo
     app.kubernetes.io/instance: release-name
-    app.kubernetes.io/version: "v1.0.3"
+    app.kubernetes.io/version: "v1.1.1"
     app.kubernetes.io/managed-by: Helm
     app.kubernetes.io/component: webhooks-server
 spec:
   replicas: 1
@@ -23,23 +23,35 @@
       app.kubernetes.io/component: webhooks-server
   template:
     metadata:
       labels:
-        helm.sh/chart: kargo-1.0.3
+        helm.sh/chart: kargo-1.1.1
         app.kubernetes.io/name: kargo
         app.kubernetes.io/instance: release-name
-        app.kubernetes.io/version: "v1.0.3"
+        app.kubernetes.io/version: "v1.1.1"
         app.kubernetes.io/managed-by: Helm
         app.kubernetes.io/component: webhooks-server
       annotations:
         configmap/checksum: 517e77c4dd49419d768a458d24a72e747c19a23a0eb5f022b3fe25fd49dd5a7c
     spec:
       serviceAccount: kargo-webhooks-server
       containers:
       - name: webhooks-server
-        image: ghcr.io/akuity/kargo:v1.0.3
+        image: ghcr.io/akuity/kargo:v1.1.1
         imagePullPolicy: IfNotPresent
-        command: ["/usr/local/bin/kargo", "webhooks-server"]
+        command: ["/sbin/tini", "--", "/usr/local/bin/kargo"]
+        args: ["webhooks-server"]
+        env:
+        - name: GOMEMLIMIT
+          valueFrom:
+            resourceFieldRef:
+              containerName: webhooks-server
+              resource: limits.memory
+        - name: GOMAXPROCS
+          valueFrom:
+            resourceFieldRef:
+              containerName: webhooks-server
+              resource: limits.cpu
         envFrom:
         - configMapRef:
             name: kargo-webhooks-server
         ports:

@jkleinlercher jkleinlercher merged commit 3301925 into main Dec 23, 2024
10 checks passed
@jkleinlercher jkleinlercher deleted the renovate/kargo-1.x branch December 23, 2024 21:37
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.

1 participant