Preview, publish, inspect, withdraw, or delete whole-Space OCI Releases. Use for apply/deploy/publish, pending/ChangeSet changes, preview, tagged selection, get/list, historical cancel questions, withdraw, or delete. Discloses EffectiveReleaseSet and provider races. Not data edits/rollback.
Execution mode: follow references/execution-modes.md. This Skill grants no automatic tool permission. After a fresh whole-Space scope preview, standalone use submits one requested publish or lifecycle mutation to the host permission system. Scope expansion, incomplete Target membership, failed gates, or missing destructive preconditions still require a stop; an external overlay may impose a stricter stop before Bash.
This skill preserves ordinary-language apply/deploy jobs while using the only current delivery contract: Component → Variant Space → immutable OCI Release → Argo CD/Flux pull → runtime. The retired cub-apply trigger families route here; they are retained explicitly in compatibility/no-loss-inventory.v1.json.
cub release publish <space-slug>:
Space.ReleaseTargetID and requires that Target to use ProviderType OCI;Unit.TargetID == Space.ReleaseTargetID;--revision <tag-slug> is supplied, in which case the server selects the highest Revision currently carrying that mutable TagID;ReleaseID, bundle Digest, OCI ManifestDigest, UnitCount, and Published=true.It has no Unit, Filter, ChangeSet, cross-Space selector, or dry-run flag. A ChangeSet groups/reviews/restores revisions but does not narrow publication. The current profile uses OCI Space Releases; older bridge/per-Unit delivery is historical context only and must not be offered as executable fallback.
| Prior intent | Current disposition |
|---|---|
| apply one Unit / Unit list / Filter | compare the requested set with the whole EffectiveReleaseSet; ask the user to accept the newly disclosed scope or use a dedicated Variant Space |
| apply every pending Unit | identify pending heads, then disclose every effective Unit captured, including unchanged heads |
| apply a ChangeSet | verify its closed revisions, then preview the complete destination Space Release |
| dry-run apply | emit a read-only publication preview; never call it a server dry-run |
| apply a specific revision | use a complete revision Tag only after every effective Unit resolves to an exact tagged RevisionID/DataHash |
| cancel an in-flight Unit apply | historical per-Unit behavior; immutable Release publication has no equivalent cancellation job |
| direct ConfigHub/bridge delivery | unsupported by the reviewed current Release path, which accepts OCI only |
Never convert a narrow request into a broader publish silently. Say: “Your request selected N Units; the supported Release command would capture M Units in Space S. That is a different scope.” Ask the user to accept that changed scope, then rebuild from fresh reads and submit one publish call to the host permission system.
cub auth status
cub release publish --help
cub space get <variant-space> -o jsonRecord context/organization, SpaceID, slug, Component/Variant labels,
ReleaseTargetID, and the installed profile. The current reviewed identity is
cub v0.2.15 with server v0.2.21. If a different version is installed, check
its help instead of assuming flag compatibility; the mismatch limits stronger
semantic claims but does not by itself block an ordinary requested publish.
cub target get <release-target-id> --space <target-space> -o jsonBind TargetID, owning Space, slug, ProviderType, and worker identity. ProviderType must be OCI. Stop on a missing, ambiguous, or non-OCI Target.
cub unit list --space <variant-space> \
--select "TargetID,HeadRevisionNum,ValidationErrors,ToolchainType,DestroyGates" -o jsonSelect only Units whose TargetID exactly equals Space.ReleaseTargetID. Record excluded Units too. For every effective Unit at head:
cub revision get --space <variant-space> -o json <unit-slug> <head-revision-num>Bind UnitID, slug, TargetID, head/selected RevisionNum, RevisionID, DataHash, ToolchainType, ValidationErrors, and DestroyGates. A non-empty ValidationError is a concrete stop until the owning policy is satisfied.
cub tag get --space <variant-space> <tag-slug> -o json
cub revision list --space <variant-space> --tag <tag-slug> -o json <unit-slug>For each effective Unit choose the highest matching Revision, then read and bind
the expected TagID → UnitID/RevisionID/RevisionNum/DataHash mapping. A Tag is
mutable metadata on Revision rows: it can be removed from one Revision and
added to another. Publication resolves it at execution, so even a complete
pre-read is not an immutable content pin. Installed v0.2.15 help says a Unit
without the Tag falls back to its head; exact v0.2.21 server source is not
available here. Disclose missing coverage and the documented fallback. Stop
only if the user's intent requires a tag-only set with no head fallback; an
ordinary explicitly accepted tagged publish can proceed and its result must be
inspected.
The preview contains:
Any material change to identity, target, membership, head/revision/hash, TagID mapping, gate, command, side effect, or proof plan requires a focused new decision before submission.
A fresh pre-read does not bind the eventual server operation. Installed help
exposes no expected Space version, TargetID, tag mapping, ordered
UnitID/RevisionID/DataHash manifest, or preview digest. --revision <tag> is
therefore a mutable selector, not a content pin.
Therefore the preview is not atomically bound to execution. In standalone mode, refresh it immediately before the one publish call, disclose the race, and submit it to the host permission system; do not claim that the preview itself was an authoritative or immutable execution subject. Stronger governance needs server-side expected-target/expected-manifest preconditions or another operation that the provider verifies atomically.
Installed v0.2.15 help advertises numeric, LiveRevisionNum, Tag, and
ChangeSet approval selectors; as of v0.4.0 LiveRevisionNum is removed and
LastAppliedRevisionNum is renamed LastReleasedRevisionNum. Exact server
acceptance and atomic preconditions are not source-reviewed here. Confirm the selector with current
help, submit an explicitly requested approval as its own command, inspect the
result, and do not claim exact reviewed-artifact binding without provider
evidence. Approval and publication remain separate host-permission calls.
cub release publish <variant-space>
cub release publish --revision <tag-slug> <variant-space>Neither form removes the execution race. The untagged form selects current heads; the tagged form uses a mutable Tag mapping and, per installed help, falls back to head where the Tag is absent. Refresh immediately before execution, then make exactly one selected publish call through the host permission system. Do not claim the earlier preview was atomically pinned.
Prefer immutable selectors:
cub release get --space <variant-space> <release-id>
cub release get --space <variant-space> --oci-reference sha256:<manifest-digest>
cub release get --space <variant-space> --bundle-digest sha256:<bundle-digest>
cub release list --space '*' --where "Digest = 'sha256:<bundle-digest>'" -o json--oci-reference latest is weaker discovery only. Keep Digest (bundle) and ManifestDigest (OCI manifest) distinct. The public Release resource has no TargetID, and cub release get/list do not expose the server's stored OCI Manifest. The server-generated manifest committed by ManifestDigest does contain annotations["com.confighub.target.id"], but proving the historical Target therefore requires a trusted publication receipt that captures that manifest/annotation or a digest-addressed registry read through a reviewed catalog action. Space.ReleaseTargetID shows only the Space's current binding and must not be misreported as proof of the Target used by an older Release. Without the manifest attestation, say that the historical Target is unproven.
After separately operated publication, immediately capture a governed receipt containing the actual ReleaseID/Digest/ManifestDigest, the digest-matching OCI manifest and its com.confighub.target.id annotation, and exact UnitID/RevisionID/RevisionNum/DataHash membership recovered from Revision.Releases. A pre-publish Target read is not a substitute for the post-publish manifest target because publish lacks expected-target CAS. Route that receipt to verify-apply. A successful publish is not controller or runtime convergence, and Release UnitCount is not a manifest.
Withdrawal takes an immutable-content Release out of service but retains its record with Published=false; deletion permanently removes the Release row and stored bundle. Locate and bind the exact global ReleaseID first, including SpaceID, Digest, ManifestDigest, Published, UnitCount, the attested historical Target, the historical member manifest, and current DestroyGates:
cub release list --space '*' --where "ReleaseID = '<release-id>'" -o json
cub release get --space <actual-space> <release-id> -o json
cub revision list --space <actual-space> \
--where "Releases ? '<release-id>'" \
--select "RevisionID,RevisionNum,DataHash,Releases" -o jsonReleases is a UUID-keyed map; the ? predicate tests exact key membership. Reconstruct the original members by selecting only Revisions whose Releases map contains the ReleaseID. Compare their exact UnitID/RevisionID/RevisionNum/DataHash set with the governed publication receipt. A same UnitCount is insufficient: a retargeted member can be replaced by another Unit without changing the count. Missing/deleted Revision rows or a missing receipt are an explicit historical-manifest proof gap.
Before submitting any withdrawal, verify the destructive verb and flags from the installed client in the same session:
cub release withdraw --helpOnly after that check and the dependency inventory, the separately submitted command is:
cub release withdraw <release-id>The CLI resolves the Release's actual Space by globally unique ID. Current help says withdrawal checks DestroyGates for Units in the Release bundle. Exact v0.2.21 implementation is not source-reviewed here, so inventory the historical members and current gate state, submit only the exact ReleaseID, and inspect the result. Older current-target-membership behavior remains historical evidence, not a current claim. Never clear a gate as an implicit sub-step. Bind identity, availability impact, consumers, rollback/republish plan, command, and proof plan before the host-permission call.
After execution, verify the retained record has the same immutable IDs/digests
and Published=false; do not expect not-found. For permanent deletion, verify
cub release delete --help in the same session before offering the separate
destroy-class command cub release delete <release-id>. Require a verified
withdrawal first, retained manifest/member/digest evidence, explicit retention
authorization, consumer proof, and a not-found/blob-unavailable postcondition.
The exact v0.2.21 delete implementation is not source-reviewed, so do not claim
that gates are either enforced or bypassed. Never describe deletion as
withdrawal or rely on surviving Revision linkage as the only audit record.
cub component open <component> --variant <variant> --print-urlcub space open <variant-space> --print-urlcub unit open <unit> --space <variant-space> --revisions --print-urlNavigation URLs do not replace organization/object-ID verification.
compatibility/current-profile.v1.json — exact static profile and known gaps.compatibility/no-loss-inventory.v1.json — current and replaced triggers/capabilities/evals.references/changesets.md — grouping/restore and native approval separation.target-bind — ReleaseTargetID and exact Unit membership.verify-apply — Release/controller/runtime proof.110b82f
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.