Browse Docs
Catalog
Config
Stacks
Operate
Docs

UX Proposal: Bulk Scan And Bulk Patch Tutorial

This is a UX proposal, not a shipped GUI. It turns the bulk operations tutorial into an intent-first operating story over rendered ConfigHub Units. View source markdown.

UNOFFICIAL/EXPERIMENTAL

Companion to Tutorial Sequence.

Shared Mapping

All tutorial UX proposals use the same map:

New to cub? Install the cub CLI first. Public catalog packages pull and render anonymously, and you sign in only once a command saves or changes ConfigHub data.

Human: express the desired base, environment, region, customer, delivery, or operation.
CLI: use cub installer for render/base work; use cub variant create for derived ConfigHub variants.
Proof: run checks, gates, and receipts before the change is called ready.

Current CLI Friction

The CLI UX exposes each primitive:

select Space
write label selector
run scan function
create changeset
bulk patch labels
bulk patch gates
dry-run mutating function
review path-level mutation output
apply function
re-scan changed Units
bulk approve revisions
verify bulk operation result

Those are the right backend primitives, but the user intent is:

Harden this reviewed release as a group.

Simpler Human Intent

A Creator-style operating flow can present:

Bulk harden release
From: NGINX/http-clusterip
Scope: all NGINX workload Units in helm-nginx-http-clusterip
Change:
  mark scan disposition reviewed
  add production-review gates
  set nginx image to nginx:1.25.5
Review:
  6 selected workload Units
  one image path changes on deployment-nginx-nginx
  all changes in changeset nginx-bulk-hardening
Checks:
  vet-format before patch
  approved mutation path
  vet-format after patch
Status: ready to approve
Approve

The user should see the object set and the changed paths before anything mutates.

Guardrail

The important guardrail is:

Bulk operations must be selector-scoped, changeset-bound, previewed, scanned,
and approved.

Data changes should use approved functions or allowed mutation paths, not ad hoc
editing of rendered objects.

This is not a new Helm render. It is a controlled operation over already uploaded ConfigHub Units.

Formal Shape

The same flow can map to:

kind: BulkOperationCreatorContract
from:
  component: NGINX
  variant: http-clusterip
  space: helm-nginx-http-clusterip
scope:
  selector: Labels.Component = 'NGINX' AND Labels.Variant = 'http-clusterip'
create:
  changeset: nginx-bulk-hardening
extends:
  labels:
    ScanDisposition: reviewed
    Operation: bulk-scan-patch
  gates:
    delete: production-review
    destroy: production-review
  functions:
    - name: set-image
      args:
        container: nginx
        image: nginx:1.25.5
review:
  selectedUnits: 6
  allowedChangedPaths:
    - spec.template.spec.containers.?name=nginx.image
checks:
  - selectorMatchesExpectedUnits
  - vetFormatBeforePatch
  - dryRunMutationReviewed
  - vetFormatAfterPatch
  - approvedRevisions
receipts:
  - scanReceipt
  - changesetReceipt
  - mutationReceipt
  - approvalReceipt

Mapping Back To Current Primitives

Creator-style intent = scan, harden, review, and approve a rendered release.
Formal contract = selector, changeset, allowed mutations, checks, receipts.
cub function vet = scan substrate.
cub changeset create = review grouping substrate.
cub unit update --patch = metadata and gate substrate.
cub function set = approved data mutation substrate.
AX/FX = same operation over many releases or rows.

The product narrative should be "harden this release safely as a group," not "copy a label selector through six different commands and remember which ones need a changeset."

Generated from the committed markdown file docs/user/ux-proposal-bulk-scan-patch-tutorial.md. The source file is the authoritative version.