@cleocode/skills 2026.5.104 → 2026.5.106
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -1,143 +1,120 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ct-release-orchestrator
|
|
3
|
-
description: "Orchestrates the
|
|
3
|
+
description: "Orchestrates the canonical 4-verb release pipeline introduced by SPEC-T9345: cleo release plan, then cleo release open, then PR + GHA tag workflow, then cleo release reconcile. The deprecated cleo release ship monolith was deleted in T10103 — do not invoke it. Use ship-e2e-smoke to validate the full pipeline end-to-end (dry-run by default). The full verb-to-state map is in docs/release/verb-matrix.md. Use when shipping a new version, validating the release pipeline end-to-end, or promoting a completed epic to released status."
|
|
4
4
|
protocol: release
|
|
5
5
|
loomStage: release
|
|
6
6
|
adrRefs:
|
|
7
7
|
- ADR-053
|
|
8
8
|
- ADR-063
|
|
9
9
|
- ADR-065
|
|
10
|
+
metadata:
|
|
11
|
+
version: 3.0.0
|
|
12
|
+
lastReviewed: 2026-05-22
|
|
13
|
+
stability: stable
|
|
10
14
|
---
|
|
11
15
|
|
|
12
16
|
# Release Orchestrator
|
|
13
17
|
|
|
14
18
|
## Overview
|
|
15
19
|
|
|
16
|
-
Owns the
|
|
20
|
+
Owns the canonical 4-verb release pipeline established by SPEC-T9345 and finalised when T9540 deleted the legacy `start` / `verify` / `publish` verbs (and the 12-step `releaseShip` monolith) plus T10103 deleted the deprecated `ship` shim. The current verb surface is documented in `docs/release/verb-matrix.md` — that file is the SSoT for verb-to-state mapping. This skill is the agent-facing entry point and references the matrix instead of redefining it.
|
|
17
21
|
|
|
18
22
|
## Core Principle
|
|
19
23
|
|
|
20
|
-
>
|
|
24
|
+
> Each verb owns exactly one state transition. No verb performs more than one mutation. Multi-step orchestration uses `ship-e2e-smoke` (validator) — never compose the verbs into a custom script.
|
|
21
25
|
|
|
22
|
-
##
|
|
26
|
+
## Canonical Pipeline
|
|
23
27
|
|
|
24
|
-
|
|
|
25
|
-
|
|
26
|
-
|
|
|
27
|
-
|
|
|
28
|
-
|
|
|
29
|
-
|
|
|
30
|
-
|
|
|
31
|
-
| RLSE-006 | Version MUST be consistent across all files listed in `release.versionBump`. | Mismatched files fail validation; exit 55. |
|
|
32
|
-
| RLSE-007 | Manifest entry MUST set `agent_type: "documentation"`. | Validator rejects any other value. |
|
|
33
|
-
| RLSE-008 | Parent protocol MUST hand off to artifact-publish when `release.artifacts` is non-empty. | Composition invariant from ARTP-005. |
|
|
34
|
-
| RLSE-009 | Provenance chain MUST be recorded for every signed release. | Composition invariant from PROV-005. |
|
|
28
|
+
| Step | Verb / Workflow | Owns transition | Notes |
|
|
29
|
+
|-----:|------------------|------------------|-------|
|
|
30
|
+
| 1 | `cleo release plan <ver> --epic <id>` | _(none)_ → `planned` | Builds the Release Plan envelope; auto-writes `CHANGELOG.md` (T10105 closes the silent-skip gap) |
|
|
31
|
+
| 2 | `cleo release open <ver>` | `planned` → `pr-opened` | Dispatches `release-prepare.yml`; the workflow cuts the branch + opens the PR |
|
|
32
|
+
| 3 | _(GHA)_ `release-prepare.yml` → PR merge | `pr-opened` → `pr-merged` | Owned by CI; verify via `cleo release pr-status <ver>` |
|
|
33
|
+
| 4 | _(GHA)_ `auto-tag-on-release-merge.yml` (T10104) | `pr-merged` → `tag-pushed` | Auto-tag on merge — no manual `git tag` needed |
|
|
34
|
+
| 5 | `cleo release reconcile <ver>` | `tag-pushed` → `published` | Backfills 11 provenance tables; idempotent |
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
Optional validators (read-only / dry-run):
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
| Verb | Use |
|
|
39
|
+
|------|-----|
|
|
40
|
+
| `cleo release ship-e2e-smoke <ver> --epic <id>` | One-shot end-to-end smoke. Dry-run by default; `--execute` performs real mutations. T10103. |
|
|
41
|
+
| `cleo release pr-status <ver>` | Poll release PR CI checks while waiting |
|
|
42
|
+
| `cleo release list` / `show <ver>` | Read-only inspection |
|
|
39
43
|
|
|
40
|
-
|
|
41
|
-
Release Protocol Artifact Publish Protocol
|
|
42
|
-
--- ---
|
|
43
|
-
1. Version bump
|
|
44
|
-
2. Changelog generation
|
|
45
|
-
3. Validation gates
|
|
46
|
-
4. Git commit + tag
|
|
47
|
-
5. ---- HANDOFF ------------------> 6. Load artifact config
|
|
48
|
-
7. Pre-validate all artifacts
|
|
49
|
-
8. Build all artifacts
|
|
50
|
-
9. ---- HANDOFF ----> Provenance Protocol
|
|
51
|
-
10. Compute digests
|
|
52
|
-
11. Generate in-toto attestation
|
|
53
|
-
12. Sign (sigstore keyless)
|
|
54
|
-
13. Record chain in releases.json
|
|
55
|
-
14. <--- RETURN ----
|
|
56
|
-
15. Publish signed artifacts
|
|
57
|
-
16. Record provenance to releases.json
|
|
58
|
-
17. <--- RETURN ----------------------
|
|
59
|
-
18. Push to remote
|
|
60
|
-
19. Update release status to "released"
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
Each handoff uses a distinct exit code:
|
|
64
|
-
|
|
65
|
-
| Edge | Exit code | Meaning |
|
|
66
|
-
|------|-----------|---------|
|
|
67
|
-
| Release → artifact-publish | 65 (`HANDOFF_REQUIRED`) | Parent yields control to the sub-protocol |
|
|
68
|
-
| artifact-publish → provenance | 65 (`HANDOFF_REQUIRED`) | Sub-protocol delegates signing |
|
|
69
|
-
| provenance → artifact-publish | 0 on success | Return to parent sub-protocol |
|
|
70
|
-
| artifact-publish → release | 0 on success, 88 on publish fail | Return to parent with result |
|
|
71
|
-
| release → tag push | 0 on success, 56 on tag fail | Final commit |
|
|
72
|
-
|
|
73
|
-
Partial-failure rollback semantics are documented in [references/composition.md](references/composition.md).
|
|
44
|
+
## Immutable Constraints
|
|
74
45
|
|
|
75
|
-
|
|
46
|
+
| ID | Rule | Enforcement |
|
|
47
|
+
|----|------|-------------|
|
|
48
|
+
| RLSE-001 | Version MUST be CalVer (`YYYY.MM.patch`) per ADR-065 — never SemVer. | `cleo release plan` rejects non-CalVer; exit 53. |
|
|
49
|
+
| RLSE-002 | `CHANGELOG.md` MUST be updated before the tag — always-write is the default behaviour of `cleo release plan` (T9784 deleted the manual changelog verb). | Plan envelope refuses to advance to `pr-opened` if the changeset directory is unparseable (T10105). |
|
|
50
|
+
| RLSE-003 | All per-task evidence gates MUST be recorded via `cleo verify <task> --gate <g> --evidence …` BEFORE `cleo complete`. The legacy `cleo release verify` batch verb was deleted in T9540. | ADR-051 per-task evidence ritual. |
|
|
51
|
+
| RLSE-004 | The release MUST be tagged via the auto-tag GHA workflow — not a manual `git tag`. | T10104 closes the auto-tag gap. |
|
|
52
|
+
| RLSE-005 | Direct pushes to `main` are prohibited. Every release ships via a PR cut by `release-prepare.yml`. | ADR-065 + branch protection (see `docs/release/branch-protection-setup.md`). |
|
|
53
|
+
| RLSE-006 | Version MUST be consistent across all workspace targets resolved by `resolveVersionBumpTargets` (root package.json + every workspace package + Cargo workspace). | Version-bump preflight in `release-prepare.yml`. |
|
|
54
|
+
| RLSE-007 | Provenance reconcile MUST run within the release-publish workflow — never as a manual followup. | Invoked by `release-publish.yml`. |
|
|
76
55
|
|
|
77
|
-
|
|
56
|
+
## Integration
|
|
78
57
|
|
|
79
|
-
|
|
80
|
-
|--------------|:---------------------:|:----------------:|
|
|
81
|
-
| `source-only` (docs, spec changes, code-only merges without a package) | no | no |
|
|
82
|
-
| `npm-package` | yes | yes (SLSA L3 via npm `--provenance`) |
|
|
83
|
-
| `docker-image` | yes | yes (cosign keyless attestation) |
|
|
84
|
-
| `cargo-crate` | yes | yes (GPG or sigstore) |
|
|
85
|
-
| `github-tarball` | yes | optional (MAY sign via cosign) |
|
|
86
|
-
| `multi-artifact` (npm + docker + tarball combo) | yes | yes |
|
|
58
|
+
Use the explicit two-verb invocation. **Do not** invoke `cleo release ship` — it was deleted in T10103.
|
|
87
59
|
|
|
88
|
-
|
|
60
|
+
```bash
|
|
61
|
+
# 1. Plan — build the canonical Release Plan envelope.
|
|
62
|
+
cleo release plan v2026.6.0 --epic T10099
|
|
89
63
|
|
|
90
|
-
|
|
64
|
+
# 2. Open — dispatch release-prepare workflow.
|
|
65
|
+
cleo release open v2026.6.0
|
|
91
66
|
|
|
92
|
-
|
|
67
|
+
# 3. (Optional) Poll PR + CI status while the workflow runs.
|
|
68
|
+
cleo release pr-status v2026.6.0
|
|
93
69
|
|
|
94
|
-
|
|
70
|
+
# 4. Reconcile — runs automatically inside release-publish.yml.
|
|
71
|
+
# Run manually only if backfilling a historical release.
|
|
72
|
+
cleo release reconcile v2026.6.0
|
|
73
|
+
```
|
|
95
74
|
|
|
96
|
-
|
|
75
|
+
To validate the whole pipeline end-to-end without shipping a real release:
|
|
97
76
|
|
|
98
77
|
```bash
|
|
99
|
-
#
|
|
100
|
-
cleo release ship v2026.
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
# Validate the parent protocol entry.
|
|
107
|
-
cleo check protocol \
|
|
108
|
-
--protocolType release \
|
|
109
|
-
--taskId T4900 \
|
|
110
|
-
--version v2026.4.5 \
|
|
111
|
-
--hasChangelog true
|
|
78
|
+
# Dry-run preview — no side effects.
|
|
79
|
+
cleo release ship-e2e-smoke v2026.6.0 --epic T10099
|
|
80
|
+
|
|
81
|
+
# Execute mode — runs plan + open, then polls for PR merge, tag push,
|
|
82
|
+
# and npm publish (default 30-min wall-clock budget).
|
|
83
|
+
cleo release ship-e2e-smoke v2026.6.0 --epic T10099 --execute
|
|
112
84
|
```
|
|
113
85
|
|
|
114
|
-
Exit
|
|
86
|
+
Exit codes (canonical):
|
|
115
87
|
|
|
116
|
-
|
|
88
|
+
- `0` — success.
|
|
89
|
+
- `53` — version validation failed (e.g. not CalVer).
|
|
90
|
+
- `54` — release-prepare workflow gate failed.
|
|
91
|
+
- `56` — tag creation failed (auto-tag workflow).
|
|
92
|
+
- `82` — `E_PLAN_NOT_FOUND` (plan envelope missing for the requested version).
|
|
93
|
+
- `83` — `E_IVTR_INCOMPLETE` (per-task IVTR loops not released).
|
|
94
|
+
- `88` — artifact publish failed.
|
|
117
95
|
|
|
118
96
|
## Anti-Patterns
|
|
119
97
|
|
|
120
98
|
| Pattern | Problem | Solution |
|
|
121
99
|
|---------|---------|----------|
|
|
122
|
-
|
|
|
123
|
-
|
|
|
124
|
-
|
|
|
125
|
-
|
|
|
126
|
-
|
|
|
127
|
-
|
|
|
128
|
-
|
|
|
129
|
-
| Running ship on a dirty worktree | Commits scoop up unrelated changes | Require a clean worktree before step 1 |
|
|
100
|
+
| Running `cleo release ship` | The verb was deleted in T10103 — the command will exit with `Unknown command`. | Use `cleo release plan` + `cleo release open`. |
|
|
101
|
+
| Manually invoking `gh workflow run release-prepare.yml` | Bypasses the plan envelope; `releases.status` stays at `planned`. | Always go through `cleo release open <ver>` — it tracks state in the `releases` table. |
|
|
102
|
+
| Manually `git tag v<ver> && git push --tags` | Bypasses the auto-tag workflow (T10104) and skips provenance backfill. | Let `auto-tag-on-release-merge.yml` create the tag on PR merge. |
|
|
103
|
+
| Hand-editing `CHANGELOG.md` for the new version | Drift between the changeset directory and the changelog. | `cleo release plan` always auto-writes the section (T10105). Use `cleo changeset add` to author entries. |
|
|
104
|
+
| Pasting one verb into another's workflow file | Multi-step orchestration belongs in `ship-e2e-smoke`. | Use `cleo release ship-e2e-smoke … --execute` for end-to-end validation. |
|
|
105
|
+
| Running the pipeline on a dirty worktree | Release commit scoops up unrelated changes. | The clean-tree gate refuses to advance. |
|
|
106
|
+
| Skipping `cleo release reconcile` after a successful tag push | 11 provenance tables stay empty; canon drift. | `release-publish.yml` runs reconcile automatically — verify it ran via `cleo release show <ver>`. |
|
|
130
107
|
|
|
131
108
|
## Critical Rules Summary
|
|
132
109
|
|
|
133
|
-
1.
|
|
134
|
-
2. The
|
|
135
|
-
3.
|
|
136
|
-
4.
|
|
137
|
-
5.
|
|
138
|
-
6.
|
|
139
|
-
7.
|
|
140
|
-
8.
|
|
110
|
+
1. The 4-verb pipeline — `plan`, `open`, `reconcile`, `rollback` — is the ONLY way to ship.
|
|
111
|
+
2. The deprecated `cleo release ship` shim was DELETED in T10103. Do not invoke it.
|
|
112
|
+
3. CalVer (`YYYY.MM.patch`) is the only valid version scheme.
|
|
113
|
+
4. `cleo release plan` always writes the CHANGELOG section unless `--no-changelog`.
|
|
114
|
+
5. The tag is created by `auto-tag-on-release-merge.yml`, not by hand.
|
|
115
|
+
6. Provenance reconcile is invoked by `release-publish.yml`, not manually (unless backfilling).
|
|
116
|
+
7. Per-task evidence gates use `cleo verify --gate --evidence` per ADR-051 — not the deleted batch verb.
|
|
117
|
+
8. Use `cleo release ship-e2e-smoke` to validate the full pipeline before a real ship.
|
|
141
118
|
|
|
142
119
|
## CI Job Inventory
|
|
143
120
|
|
|
@@ -155,8 +132,10 @@ Consult the inventory whenever:
|
|
|
155
132
|
|
|
156
133
|
This skill binds to the **release** LOOM lifecycle stage. Governing ADRs:
|
|
157
134
|
|
|
158
|
-
- [ADR-053 — project-agnostic release pipeline](../../../../.cleo/adrs/ADR-053-project-agnostic-release-pipeline.md) —
|
|
159
|
-
- [ADR-063 — release pipeline](../../../../.cleo/adrs/ADR-063-release-pipeline.md) —
|
|
160
|
-
- [ADR-065 — PR-required release flow](../../../../.cleo/adrs/ADR-065-pr-required-release-flow.md) —
|
|
135
|
+
- [ADR-053 — project-agnostic release pipeline](../../../../.cleo/adrs/ADR-053-project-agnostic-release-pipeline.md) — language-agnostic version bump → changelog → tag flow.
|
|
136
|
+
- [ADR-063 — release pipeline](../../../../.cleo/adrs/ADR-063-release-pipeline.md) — original 12-step pipeline (historical; superseded by SPEC-T9345 §4).
|
|
137
|
+
- [ADR-065 — PR-required release flow](../../../../.cleo/adrs/ADR-065-pr-required-release-flow.md) — direct pushes to `main` are prohibited.
|
|
138
|
+
|
|
139
|
+
Live verb matrix: [docs/release/verb-matrix.md](../../../../docs/release/verb-matrix.md) — the single source of truth for verb-to-state mapping.
|
|
161
140
|
|
|
162
141
|
LOOM coverage matrix: [docs/skills/loom-coverage-matrix.md](../../../../docs/skills/loom-coverage-matrix.md).
|