@cleocode/skills 2026.9.20 → 2026.9.22

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.
Files changed (154) hide show
  1. package/README.md +46 -63
  2. package/frontmatter.d.mts +60 -0
  3. package/frontmatter.mjs +277 -0
  4. package/index.d.ts +3 -3
  5. package/index.js +34 -9
  6. package/package.json +4 -2
  7. package/profiles/core.json +10 -3
  8. package/profiles/full.json +10 -6
  9. package/profiles/recommended.json +29 -3
  10. package/skills/_shared/manifest-operations.md +19 -40
  11. package/skills/_shared/skill-chaining-patterns.md +5 -9
  12. package/skills/_shared/subagent-protocol-base.md +6 -6
  13. package/skills/_shared/task-system-integration.md +6 -6
  14. package/skills/ct-adr-recorder/SKILL.md +22 -16
  15. package/skills/ct-artifact-publisher/SKILL.md +14 -6
  16. package/skills/ct-cleo/SKILL.md +97 -16
  17. package/skills/ct-cleo/__tests__/injection-content.test.ts +62 -13
  18. package/skills/ct-cleo/references/loom-lifecycle.md +1 -1
  19. package/skills/{ct-memory/SKILL.md → ct-cleo/references/memory.md} +10 -18
  20. package/skills/ct-cleo/references/orchestrator-constraints.md +5 -5
  21. package/skills/ct-cleo/references/session-protocol.md +17 -9
  22. package/skills/{ct-stickynote/SKILL.md → ct-cleo/references/sticky-notes.md} +7 -25
  23. package/skills/ct-codebase-mapper/SKILL.md +66 -38
  24. package/skills/ct-consensus-voter/SKILL.md +14 -6
  25. package/skills/ct-contribution/SKILL.md +11 -5
  26. package/skills/ct-council/SKILL.md +5 -0
  27. package/skills/ct-dev-workflow/SKILL.md +9 -8
  28. package/skills/ct-documentor/SKILL.md +37 -34
  29. package/skills/{ct-docs-review/__tests__/skill-docs-review.test.ts → ct-documentor/__tests__/reviewing-reference.test.ts} +4 -3
  30. package/skills/{ct-docs-write/__tests__/skill-docs-write.test.ts → ct-documentor/__tests__/writing-reference.test.ts} +4 -3
  31. package/skills/ct-documentor/references/anti-patterns.md +8 -8
  32. package/skills/{ct-docs-write → ct-documentor}/references/audience-targeting.md +5 -5
  33. package/skills/ct-documentor/references/chain-orchestration.md +19 -19
  34. package/skills/{ct-docs-write → ct-documentor}/references/cleo-style-guide.md +1 -1
  35. package/skills/ct-documentor/references/doc-types-and-templates.md +1 -1
  36. package/skills/{ct-docs-review → ct-documentor}/references/pr-review-mode.md +1 -1
  37. package/skills/{ct-docs-review/SKILL.md → ct-documentor/references/reviewing.md} +6 -22
  38. package/skills/ct-documentor/references/style-coordination.md +5 -5
  39. package/skills/{ct-docs-review → ct-documentor}/references/style-violations.md +1 -1
  40. package/skills/{ct-docs-write/SKILL.md → ct-documentor/references/writing.md} +5 -21
  41. package/skills/ct-epic-architect/SKILL.md +16 -9
  42. package/skills/ct-epic-architect/references/commands.md +5 -5
  43. package/skills/ct-epic-architect/references/output-format.md +2 -2
  44. package/skills/ct-epic-architect/references/patterns.md +2 -2
  45. package/skills/ct-epic-architect/references/skill-aware-execution.md +3 -3
  46. package/skills/ct-grade/SKILL.md +7 -4
  47. package/skills/ct-grade/agents/scenario-runner.md +1 -1
  48. package/skills/ct-ivt-looper/SKILL.md +27 -21
  49. package/skills/ct-lead/SKILL.md +49 -12
  50. package/skills/ct-lead/references/aggregation-protocol.md +44 -21
  51. package/skills/ct-lead/references/spawn-pattern.md +12 -11
  52. package/skills/ct-orchestrator/README.md +2 -2
  53. package/skills/ct-orchestrator/SKILL.md +34 -11
  54. package/skills/ct-orchestrator/references/SUBAGENT-PROTOCOL-BLOCK.md +4 -4
  55. package/skills/ct-orchestrator/references/autonomous-operation.md +4 -4
  56. package/skills/ct-orchestrator/references/orchestrator-compliance.md +3 -3
  57. package/skills/ct-orchestrator/references/orchestrator-patterns.md +20 -19
  58. package/skills/ct-orchestrator/references/orchestrator-recovery.md +13 -23
  59. package/skills/ct-orchestrator/references/orchestrator-spawning.md +9 -10
  60. package/skills/ct-orchestrator/references/orchestrator-tokens.md +9 -9
  61. package/skills/ct-provenance-keeper/SKILL.md +14 -6
  62. package/skills/ct-release-orchestrator/SKILL.md +23 -13
  63. package/skills/ct-release-orchestrator/references/composition.md +1 -1
  64. package/skills/ct-release-orchestrator/references/release-types.md +33 -15
  65. package/skills/ct-research-agent/SKILL.md +18 -12
  66. package/skills/ct-research-agent/references/triggers-and-routing.md +4 -4
  67. package/skills/{ct-skill-creator → ct-skill-author}/SKILL.md +12 -4
  68. package/skills/{ct-skill-validator → ct-skill-author}/agents/ecosystem-checker.md +1 -1
  69. package/skills/{ct-skill-validator → ct-skill-author}/evals/quality_evals.json +10 -10
  70. package/skills/{ct-skill-validator → ct-skill-author}/evals/trigger_queries.json +1 -1
  71. package/skills/{ct-skill-validator → ct-skill-author}/references/cleo-ecosystem-rules.md +8 -4
  72. package/skills/{ct-skill-creator → ct-skill-author}/references/provider-deployment.md +10 -6
  73. package/skills/{ct-skill-validator/SKILL.md → ct-skill-author/references/validating.md} +14 -16
  74. package/skills/{ct-skill-validator → ct-skill-author}/references/validation-rules.md +2 -2
  75. package/skills/{ct-skill-validator → ct-skill-author}/scripts/_skill_finder.py +2 -2
  76. package/skills/{ct-skill-validator → ct-skill-author}/scripts/check_depth.py +2 -5
  77. package/skills/{ct-skill-validator → ct-skill-author}/scripts/generate_validation_report.py +1 -1
  78. package/skills/{ct-skill-validator → ct-skill-author}/scripts/run_quality_eval.py +2 -2
  79. package/skills/ct-spec-writer/SKILL.md +13 -7
  80. package/skills/ct-task-executor/SKILL.md +21 -21
  81. package/skills/ct-task-executor/references/common-failures.md +3 -3
  82. package/skills/ct-task-executor/references/evidence-and-gates.md +1 -0
  83. package/skills/ct-validator/SKILL.md +15 -9
  84. package/skills/ct-validator/references/compliance-reports.md +1 -1
  85. package/skills/ct-validator/references/validation-modes.md +3 -3
  86. package/skills/manifest.json +1313 -481
  87. package/dispatch-config.json +0 -983
  88. package/provider-skills-map.json +0 -97
  89. package/skills/ct-docs-lookup/SKILL.md +0 -181
  90. package/skills/ct-docs-lookup/references/ctx7-workflow.md +0 -198
  91. package/skills/ct-docs-lookup/references/library-id-resolution.md +0 -217
  92. package/skills/ct-docs-lookup/references/version-specific-docs.md +0 -220
  93. package/skills/ct-master-tac/SKILL.md +0 -116
  94. package/skills/ct-master-tac/__tests__/install.test.ts +0 -283
  95. package/skills/ct-master-tac/bundled/README.md +0 -40
  96. package/skills/ct-master-tac/bundled/protocols/architecture-decision.cant +0 -90
  97. package/skills/ct-master-tac/bundled/protocols/artifact-publish.cant +0 -105
  98. package/skills/ct-master-tac/bundled/protocols/consensus.cant +0 -85
  99. package/skills/ct-master-tac/bundled/protocols/contribution.cant +0 -92
  100. package/skills/ct-master-tac/bundled/protocols/decomposition.cant +0 -102
  101. package/skills/ct-master-tac/bundled/protocols/implementation.cant +0 -77
  102. package/skills/ct-master-tac/bundled/protocols/provenance.cant +0 -100
  103. package/skills/ct-master-tac/bundled/protocols/release.cant +0 -107
  104. package/skills/ct-master-tac/bundled/protocols/research.cant +0 -77
  105. package/skills/ct-master-tac/bundled/protocols/specification.cant +0 -77
  106. package/skills/ct-master-tac/bundled/protocols/testing.cant +0 -99
  107. package/skills/ct-master-tac/bundled/protocols/validation.cant +0 -75
  108. package/skills/ct-master-tac/bundled/teams/platform.cant +0 -115
  109. package/skills/ct-master-tac/manifest.json +0 -55
  110. package/skills/ct-skill-creator/eval-viewer/__pycache__/generate_review.cpython-314.pyc +0 -0
  111. package/skills/ct-skill-creator/manifest-entry.json +0 -17
  112. package/skills/ct-skill-creator/scripts/__pycache__/__init__.cpython-314.pyc +0 -0
  113. package/skills/ct-skill-creator/scripts/__pycache__/aggregate_benchmark.cpython-314.pyc +0 -0
  114. package/skills/ct-skill-creator/scripts/__pycache__/generate_report.cpython-314.pyc +0 -0
  115. package/skills/ct-skill-creator/scripts/__pycache__/improve_description.cpython-314.pyc +0 -0
  116. package/skills/ct-skill-creator/scripts/__pycache__/init_skill.cpython-314.pyc +0 -0
  117. package/skills/ct-skill-creator/scripts/__pycache__/quick_validate.cpython-314.pyc +0 -0
  118. package/skills/ct-skill-creator/scripts/__pycache__/run_eval.cpython-314.pyc +0 -0
  119. package/skills/ct-skill-creator/scripts/__pycache__/run_loop.cpython-314.pyc +0 -0
  120. package/skills/ct-skill-creator/scripts/__pycache__/utils.cpython-314.pyc +0 -0
  121. package/skills/ct-skill-validator/manifest-entry.json +0 -20
  122. package/skills/ct-stickynote/README.md +0 -14
  123. package/skills/signaldock-connect/SKILL.md +0 -132
  124. package/skills/signaldock-connect/assets/agent-card.json +0 -48
  125. package/skills/signaldock-connect/references/api-endpoints.md +0 -131
  126. package/skills.json +0 -495
  127. /package/skills/{ct-docs-review → ct-documentor}/references/inline-comment-patterns.md +0 -0
  128. /package/skills/{ct-docs-write → ct-documentor}/references/markdown-patterns.md +0 -0
  129. /package/skills/{ct-skill-creator → ct-skill-author}/agents/analyzer.md +0 -0
  130. /package/skills/{ct-skill-creator → ct-skill-author}/agents/comparator.md +0 -0
  131. /package/skills/{ct-skill-creator → ct-skill-author}/agents/grader.md +0 -0
  132. /package/skills/{ct-skill-creator → ct-skill-author}/assets/eval_review.html +0 -0
  133. /package/skills/{ct-skill-validator → ct-skill-author}/assets/valid-skill-example.md +0 -0
  134. /package/skills/{ct-skill-creator → ct-skill-author}/eval-viewer/generate_review.py +0 -0
  135. /package/skills/{ct-skill-creator → ct-skill-author}/eval-viewer/viewer.html +0 -0
  136. /package/skills/{ct-skill-creator → ct-skill-author}/references/dynamic-context.md +0 -0
  137. /package/skills/{ct-skill-creator → ct-skill-author}/references/frontmatter.md +0 -0
  138. /package/skills/{ct-skill-creator → ct-skill-author}/references/invocation-control.md +0 -0
  139. /package/skills/{ct-skill-creator → ct-skill-author}/references/output-patterns.md +0 -0
  140. /package/skills/{ct-skill-creator → ct-skill-author}/references/schemas.md +0 -0
  141. /package/skills/{ct-skill-creator → ct-skill-author}/references/workflows.md +0 -0
  142. /package/skills/{ct-skill-creator → ct-skill-author}/scripts/__init__.py +0 -0
  143. /package/skills/{ct-skill-creator → ct-skill-author}/scripts/aggregate_benchmark.py +0 -0
  144. /package/skills/{ct-skill-validator → ct-skill-author}/scripts/audit_body.py +0 -0
  145. /package/skills/{ct-skill-validator → ct-skill-author}/scripts/check_ecosystem.py +0 -0
  146. /package/skills/{ct-skill-creator → ct-skill-author}/scripts/generate_report.py +0 -0
  147. /package/skills/{ct-skill-creator → ct-skill-author}/scripts/improve_description.py +0 -0
  148. /package/skills/{ct-skill-creator → ct-skill-author}/scripts/init_skill.py +0 -0
  149. /package/skills/{ct-skill-creator → ct-skill-author}/scripts/package_skill.py +0 -0
  150. /package/skills/{ct-skill-creator → ct-skill-author}/scripts/quick_validate.py +0 -0
  151. /package/skills/{ct-skill-creator → ct-skill-author}/scripts/run_eval.py +0 -0
  152. /package/skills/{ct-skill-creator → ct-skill-author}/scripts/run_loop.py +0 -0
  153. /package/skills/{ct-skill-creator → ct-skill-author}/scripts/utils.py +0 -0
  154. /package/skills/{ct-skill-validator → ct-skill-author}/scripts/validate.py +0 -0
@@ -2,10 +2,19 @@
2
2
  name: ct-ivt-looper
3
3
  description: "Runs a project-agnostic autonomous Implement-then-Validate-then-Test compliance loop on any git worktree. Detects the project's test framework (vitest, jest, mocha, pytest, unittest, go-test, cargo-test, rspec, phpunit, bats, or other) and iterates until the implementation satisfies its specification, recording convergence metrics to the manifest. Use when given an implementation task that must ship verified: the IVT loop is the autonomous compliance layer enforced before any release or PR. Triggers on phrases like 'implement and verify', 'run the IVT loop', 'ship this task', 'complete implementation with tests', 'verify against spec', or any implementation task with acceptance criteria. Works in any git worktree regardless of language or framework, never hardcoded to one project's tooling."
4
4
  protocol: testing
5
- loomStage: testing
6
5
  adrRefs:
7
6
  - ADR-051
8
7
  - ADR-061
8
+ metadata:
9
+ version: 1.0.2
10
+ tier: on-demand
11
+ install: harness
12
+ covers:
13
+ - packages/core/src/validation/protocols/cant/testing.cant
14
+ - packages/core/src/validation/protocols/protocols-markdown/testing.md
15
+ loomStage: testing
16
+ lastReviewed: 2026-09-28
17
+ stability: stable
9
18
  ---
10
19
 
11
20
  # IVT Looper
@@ -147,24 +156,22 @@ Record the loop outcome through `cleo check protocol`:
147
156
 
148
157
  ```bash
149
158
  # Success case: loop converged on iteration 3.
150
- cleo check protocol \
151
- --protocolType testing \
159
+ cleo check protocol testing \
152
160
  --framework vitest \
153
- --testsRun 142 \
154
- --testsPassed 142 \
155
- --testsFailed 0 \
156
- --ivtLoopConverged true \
157
- --ivtLoopIterations 3
161
+ --tests-run 142 \
162
+ --tests-passed 142 \
163
+ --tests-failed 0 \
164
+ --ivt-loop-converged true \
165
+ --ivt-loop-iterations 3
158
166
 
159
167
  # Failure case: loop exhausted iterations, HITL escalation.
160
- cleo check protocol \
161
- --protocolType testing \
168
+ cleo check protocol testing \
162
169
  --framework pytest \
163
- --testsRun 87 \
164
- --testsPassed 84 \
165
- --testsFailed 3 \
166
- --ivtLoopConverged false \
167
- --ivtLoopIterations 5
170
+ --tests-run 87 \
171
+ --tests-passed 84 \
172
+ --tests-failed 3 \
173
+ --ivt-loop-converged false \
174
+ --ivt-loop-iterations 5
168
175
  ```
169
176
 
170
177
  Exit code 0 = loop converged and protocol is valid. Exit code 65 = `HANDOFF_REQUIRED` (non-convergence).
@@ -172,11 +179,10 @@ Exit code 0 = loop converged and protocol is valid. Exit code 65 = `HANDOFF_REQU
172
179
  This skill MUST also chain a validation check against the spec before its own testing check:
173
180
 
174
181
  ```bash
175
- cleo check protocol \
176
- --protocolType validation \
177
- --specMatchConfirmed true \
178
- --testSuitePassed true \
179
- --protocolComplianceChecked true
182
+ cleo check protocol validation \
183
+ --spec-match-confirmed true \
184
+ --test-suite-passed true \
185
+ --protocol-compliance-checked true
180
186
  ```
181
187
 
182
188
  ## Anti-Patterns
@@ -201,7 +207,7 @@ cleo check protocol \
201
207
  5. Never run on `main`, `master`, or `trunk` — stop and request a feature branch.
202
208
  6. Record `framework`, `testsRun`, `testsPassed`, `testsFailed`, `ivtLoopConverged`, `ivtLoopIterations` in the manifest.
203
209
  7. On non-convergence, exit 65 and leave the worktree untouched.
204
- 8. Validate every run via `cleo check protocol --protocolType testing`.
210
+ 8. Validate every run via `cleo check protocol testing`.
205
211
 
206
212
  ## See also / References
207
213
 
@@ -1,6 +1,15 @@
1
1
  ---
2
2
  name: ct-lead
3
- description: "Phase Lead orchestration playbook for spawning and supervising a parallel worker swarm in one wave. Use when spawned by ct-orchestrator with role=orchestrator to fan out N leaf workers via delegate_task, drain the epic-<TID>.wave-<n> conduit topic plus pipeline_manifest, await rollupWaveStatus convergence, and return ONE rolled-up contract string to the parent Orchestrator. Triggers: 'phase lead', 'wave lead', 'supervise wave', 'fan out workers', 'aggregate worker results', 'rollup wave', any task with role=orchestrator that is itself a child of another orchestrator. Implements ADR-070 hierarchical orchestration."
3
+ description: "Phase Lead orchestration playbook for spawning and supervising a parallel worker swarm in one wave. Use when spawned by ct-orchestrator with role=orchestrator to fan out N leaf workers via delegate_task, drain the epic-{TID}.wave-{n} conduit topic plus pipeline_manifest, await rollupWaveStatus convergence, and return ONE rolled-up contract string to the parent Orchestrator. Triggers: 'phase lead', 'wave lead', 'supervise wave', 'fan out workers', 'aggregate worker results', 'rollup wave', any task with role=orchestrator that is itself a child of another orchestrator. Implements ADR-070 hierarchical orchestration."
4
+ metadata:
5
+ version: 1.0.5
6
+ tier: core
7
+ install: harness
8
+ covers:
9
+ - packages/core/src/orchestration/lead-rollup.ts
10
+ - packages/core/src/orchestration/waves.ts
11
+ lastReviewed: 2026-09-28
12
+ stability: stable
4
13
  ---
5
14
 
6
15
  # Phase Lead Protocol (ct-lead)
@@ -28,7 +37,7 @@ exactly ONE aggregated summary.
28
37
  |----|------|-------------------|
29
38
  | LEAD-005 | Subscribe BEFORE spawn | Subscribe to `epic-<TID>.wave-<n>` conduit topic before issuing any `delegate_task` — late subscribers miss early completion events |
30
39
  | LEAD-006 | Parallel fanout | All workers in a wave fan out via a SINGLE `delegate_task` batch (`tasks: [...]`) — never sequential per-worker calls |
31
- | LEAD-007 | Bounded by `delegation.max_concurrent_children` | Wave width MUST NOT exceed the configured cap (default 10); split into multiple waves if larger |
40
+ | LEAD-007 | Bounded by `maxConcurrent` (default 10) | Wave width MUST NOT exceed it; split into multiple waves if larger. No config key or runtime check enforces this yet (`delegation.max_concurrent_children` is not read by CLEO) — the Lead enforces it |
32
41
  | LEAD-008 | Convergence over polling | Wait on conduit signals + `rollupWaveStatus`; do not poll task status in a busy loop |
33
42
  | LEAD-009 | Roll up via `rollupWaveStatus` | Always call `rollupWaveStatus(epicId, waveId)` before returning — never hand-aggregate manifest rows |
34
43
  | LEAD-010 | One summary upstream | Return ONE contract string to parent Orchestrator; detail lives in pipeline_manifest under your wave's roll-up entry |
@@ -44,7 +53,7 @@ The parent Orchestrator spawns you with a resolved prompt containing:
44
53
  | `waveId` | Wave index within the epic (e.g., `wave-2`) |
45
54
  | `workerTasks[]` | Pre-resolved leaf task IDs in this wave (deps already satisfied) |
46
55
  | `conduitTopic` | `epic-<epicId>.wave-<waveId>` — your subscription topic |
47
- | `maxConcurrent` | Effective `delegation.max_concurrent_children` |
56
+ | `maxConcurrent` | Wave width cap passed by the parent (default 10) |
48
57
  | `subagentTimeoutSeconds` | Default 600 — wall-clock budget per worker |
49
58
 
50
59
  ## Workflow
@@ -53,10 +62,11 @@ The parent Orchestrator spawns you with a resolved prompt containing:
53
62
 
54
63
  ```bash
55
64
  # Subscribe FIRST — race-free (LEAD-005)
56
- cleo conduit subscribe "epic-${EPIC}.wave-${WAVE}" --as-lead
65
+ cleo conduit subscribe --topic "epic-${EPIC}.wave-${WAVE}"
57
66
 
58
- # Verify the wave is well-formed
59
- cleo orchestrate ready --epic "${EPIC}" --wave "${WAVE}" --json
67
+ # Verify the wave is well-formed: ready tasks and the computed wave plan
68
+ cleo orchestrate ready "${EPIC}"
69
+ cleo orchestrate waves "${EPIC}"
60
70
  ```
61
71
 
62
72
  ### 2. Parallel Fanout (one batch)
@@ -80,16 +90,43 @@ delegate_task({
80
90
  ### 3. Convergence (drain conduit + manifest)
81
91
 
82
92
  ```bash
83
- # Block on conduit signals — fires on every worker terminal status
84
- cleo conduit await "epic-${EPIC}.wave-${WAVE}" \
85
- --expect "${WORKER_COUNT}" \
86
- --timeout 600
93
+ # WAVE = the wave number `cleo orchestrate waves` prints now (1-based);
94
+ # topic and roll-up use the same number.
95
+
96
+ # Read worker terminal signals on the wave topic. There is no blocking
97
+ # await: poll with --since between checks, bounded by the wave budget.
98
+ cleo conduit listen --topic "epic-${EPIC}.wave-${WAVE}" --since "${SPAWNED_AT}"
87
99
 
88
100
  # Roll up authoritative status from pipeline_manifest
89
- cleo lead rollup --epic "${EPIC}" --wave "${WAVE}" --json \
101
+ cleo orchestrate roll-up "${EPIC}" --wave "${WAVE}" --json \
90
102
  > /tmp/rollup-${EPIC}-${WAVE}.json
91
103
  ```
92
104
 
105
+ > **Wave contract (T12682).** One wave number `n` names everything: it is
106
+ > the 1-based number `cleo orchestrate waves <epic>` prints, spawned workers
107
+ > publish on `epic-<epicId>.wave-<n>`, and `cleo orchestrate roll-up <epic>
108
+ > --wave <n>` takes the same `n` (`--wave 0` is refused with
109
+ > `E_CLEO_VALIDATION`, pointing at `cleo orchestrate waves`).
110
+ >
111
+ > **What a wave number guarantees (T12683).** A task's wave is its
112
+ > structural dependency depth: 1 plus the deepest wave among its
113
+ > dependencies, whatever their status and whichever epic holds them.
114
+ >
115
+ > - **Stable** when any task's status changes (done, cancelled, archived)
116
+ > or a task moves between epics. A finished wave stays in `cleo
117
+ > orchestrate waves` with status `completed`; `--hide-completed` omits
118
+ > finished waves without renumbering the rest.
119
+ > - **Not stable** when a dependency edge is added or removed anywhere
120
+ > upstream, including in another epic: downstream waves shift. If you
121
+ > subscribed ahead to `epic-<epicId>.wave-<n>`, re-read `cleo orchestrate
122
+ > waves` after any dependency change.
123
+ > - **Numbers can skip, and an epic's first wave can be above 1** (a task
124
+ > whose external prerequisite sits at depth 3 is in wave 4). Always take
125
+ > `n` from `cleo orchestrate waves`; never assume the first wave is 1.
126
+ >
127
+ > `orchestrate ready`, `plan` and `parallel start --wave <n>` never re-run
128
+ > finished tasks.
129
+
93
130
  `rollupWaveStatus` (T9082, `packages/core/src/orchestration/lead-rollup.ts`)
94
131
  returns `{ wave, total, complete, partial, blocked, failed, workers: [...] }`.
95
132
 
@@ -128,7 +165,7 @@ cleo manifest append \
128
165
  - **Sequential fanout**: spawning workers one-by-one defeats parallelism and breaks the wave model — use ONE batch (LEAD-006).
129
166
  - **Recursive Leads**: do NOT spawn a Lead from within a Lead — escalate to parent Orchestrator with a `blocked` contract instead (LEAD-003).
130
167
  - **Forwarding raw outputs**: never paste worker manifest entries upstream — parent's context budget assumes ONE rollup string per wave (LEAD-004).
131
- - **Polling**: do not `while true; sleep` on task status — use `cleo conduit await` (LEAD-008).
168
+ - **Polling task status**: do not `while true; sleep` on `cleo show` — read the wave topic with `cleo conduit listen --topic … --since …` and aggregate with `cleo orchestrate roll-up` (LEAD-008).
132
169
  - **Unbounded retries**: cap local retry at 1 per worker — repeated failure escalates to parent.
133
170
 
134
171
  ## Cross-references
@@ -21,12 +21,12 @@ fast-finishing workers and silently loses early `complete` signals.
21
21
 
22
22
  ```bash
23
23
  # CORRECT — subscribe, then spawn
24
- cleo conduit subscribe "epic-T9080.wave-2" --as-lead
25
- cleo orchestrate spawn-batch --tasks T9301,T9302,T9303 ...
24
+ cleo conduit subscribe --topic "epic-T9080.wave-2"
25
+ cleo orchestrate fanout T9080 --tasks T9301,T9302,T9303
26
26
 
27
27
  # WRONG — fanout, then subscribe (race window)
28
- cleo orchestrate spawn-batch --tasks T9301,T9302,T9303 ...
29
- cleo conduit subscribe "epic-T9080.wave-2" --as-lead # may miss T9301 done
28
+ cleo orchestrate fanout T9080 --tasks T9301,T9302,T9303
29
+ cleo conduit subscribe --topic "epic-T9080.wave-2" # may miss T9301 done
30
30
  ```
31
31
 
32
32
  The conduit retains buffered signals for `conduit.replay_window` (default 30s)
@@ -36,19 +36,44 @@ to defend against tiny races, but relying on the buffer is brittle.
36
36
 
37
37
  ## 2. Drain loop
38
38
 
39
- The Lead blocks on `cleo conduit await` which yields when the expected number
40
- of terminal signals arrive OR the wall-clock timeout elapses.
39
+ There is no blocking await. The Lead polls the wave topic with
40
+ `cleo conduit listen --topic <topic> --since <last-seen>` until the expected number of
41
+ terminal signals has arrived OR its wall-clock budget elapses.
41
42
 
42
43
  ```bash
43
- cleo conduit await "epic-T9080.wave-2" \
44
- --expect 5 \
45
- --timeout 600 \
46
- --json > /tmp/conduit-drain.json
44
+ cleo conduit listen --topic "epic-T9080.wave-2" --since "${SPAWNED_AT}" \
45
+ > /tmp/conduit-drain.json
47
46
 
48
- # Then read authoritative state from manifest
49
- cleo lead rollup --epic T9080 --wave wave-2 --json > /tmp/rollup.json
47
+ # Then read authoritative state from manifest — same wave number as the topic.
48
+ cleo orchestrate roll-up T9080 --wave 2 --json > /tmp/rollup.json
50
49
  ```
51
50
 
51
+ > **Wave contract (T12682).** One wave number `n` names everything: it is
52
+ > the 1-based number `cleo orchestrate waves <epic>` prints, spawned workers
53
+ > publish on `epic-<epicId>.wave-<n>`, and `cleo orchestrate roll-up <epic>
54
+ > --wave <n>` takes the same `n` (`--wave 0` is refused with
55
+ > `E_CLEO_VALIDATION`, pointing at `cleo orchestrate waves`).
56
+ >
57
+ > **What a wave number guarantees (T12683).** A task's wave is its
58
+ > structural dependency depth: 1 plus the deepest wave among its
59
+ > dependencies, whatever their status and whichever epic holds them.
60
+ >
61
+ > - **Stable** when any task's status changes (done, cancelled, archived)
62
+ > or a task moves between epics. A finished wave stays in `cleo
63
+ > orchestrate waves` with status `completed`; `--hide-completed` omits
64
+ > finished waves without renumbering the rest.
65
+ > - **Not stable** when a dependency edge is added or removed anywhere
66
+ > upstream, including in another epic: downstream waves shift. If you
67
+ > subscribed ahead to `epic-<epicId>.wave-<n>`, re-read `cleo orchestrate
68
+ > waves` after any dependency change.
69
+ > - **Numbers can skip, and an epic's first wave can be above 1** (a task
70
+ > whose external prerequisite sits at depth 3 is in wave 4). Always take
71
+ > `n` from `cleo orchestrate waves`; never assume the first wave is 1.
72
+ >
73
+ > `orchestrate ready`, `plan` and `parallel start --wave <n>` never re-run
74
+ > finished tasks.
75
+
76
+
52
77
  `rollupWaveStatus` returns:
53
78
 
54
79
  ```json
@@ -94,15 +119,13 @@ Local retry shape:
94
119
  RETRIABLE=$(jq -r '.workers[] | select(.status=="failed" and (.reason|test("testsPassed|qaPassed|INFRASTRUCTURE"))) | .taskId' /tmp/rollup.json)
95
120
 
96
121
  # Re-spawn ONLY those (NEW conduit topic suffix to avoid replay collision)
97
- cleo orchestrate spawn-batch \
98
- --parent "${LEAD_TASK_ID}" --parent-role orchestrator \
99
- --topic "epic-T9080.wave-2.retry-1" \
100
- --tasks "$(echo $RETRIABLE | tr ' ' ,)" \
101
- --child-role leaf --timeout 600
102
-
103
- # Re-drain on the retry topic, merge into final rollup
104
- cleo conduit await "epic-T9080.wave-2.retry-1" --expect $(echo $RETRIABLE | wc -w) --timeout 600
105
- cleo lead rollup --epic T9080 --wave wave-2 --include-retries --json > /tmp/rollup-final.json
122
+ cleo conduit subscribe --topic "epic-T9080.wave-2.retry-1"
123
+ cleo orchestrate fanout T9080 --tasks "$(echo $RETRIABLE | tr ' ' ,)"
124
+
125
+ # Re-drain on the retry topic, then roll up again (the manifest holds the
126
+ # latest status of every worker, retries included)
127
+ cleo conduit listen --topic "epic-T9080.wave-2.retry-1" --since "${RETRY_AT}"
128
+ cleo orchestrate roll-up T9080 --wave 2 --json > /tmp/rollup-final.json
106
129
  ```
107
130
 
108
131
  After the single retry pass, whatever `rollup-final.json` shows IS the
@@ -1,7 +1,7 @@
1
1
  # Spawn Pattern — Worker Fanout Examples
2
2
 
3
3
  The Phase Lead fans out all workers in a single `delegate_task` batch.
4
- Width is bounded by `delegation.max_concurrent_children` (default 10).
4
+ Width is bounded by `maxConcurrent` (default 10; a convention the Lead enforces — no runtime check exists).
5
5
  Each child carries `role=leaf` and inherits the wave's conduit topic.
6
6
 
7
7
  All examples assume:
@@ -32,15 +32,14 @@ Typical for narrowly-scoped IVTR waves where deps fan in tightly.
32
32
  }
33
33
  ```
34
34
 
35
- CLI equivalent (one shell call, NOT a loop):
35
+ CLI equivalent (one shell call, NOT a loop). `fanout` takes the epic and the
36
+ task list only; role, model and timeout come from each task's spawn prompt
37
+ (`cleo orchestrate spawn <taskId>`), and the Lead subscribes to the wave topic
38
+ before it runs:
36
39
 
37
40
  ```bash
38
- cleo orchestrate spawn-batch \
39
- --parent T9080-lead-w2 --parent-role orchestrator \
40
- --topic epic-T9080.wave-2 \
41
- --timeout 600 \
42
- --tasks T9101,T9102,T9103 \
43
- --child-role leaf --model sonnet
41
+ cleo conduit subscribe --topic epic-T9080.wave-2
42
+ cleo orchestrate fanout T9080 --tasks T9101,T9102,T9103
44
43
  ```
45
44
 
46
45
  ---
@@ -69,7 +68,7 @@ cleo orchestrate spawn-batch \
69
68
 
70
69
  ## Example 3 — 10-worker fanout (max-width wave)
71
70
 
72
- This is the upper bound at default `delegation.max_concurrent_children = 10`.
71
+ This is the upper bound at the default `maxConcurrent = 10`.
73
72
  For wider waves, the parent Orchestrator MUST split into multiple Leads.
74
73
 
75
74
  ```json
@@ -111,10 +110,12 @@ done
111
110
  DO NOT exceed `maxConcurrent`:
112
111
 
113
112
  ```bash
114
- # WRONG — runtime rejects with E_WAVE_OVERSIZED
115
- cleo orchestrate spawn-batch --tasks $(seq -s, T9301 T9320) # 20 > 10
113
+ # WRONG — 20 workers in one wave; split into waves of at most maxConcurrent
114
+ cleo orchestrate fanout T9300 --tasks $(seq -s, T9301 T9320)
116
115
  ```
117
116
 
117
+ Nothing in the runtime enforces the cap today; the Lead must.
118
+
118
119
  DO NOT spawn workers with `role=orchestrator`:
119
120
 
120
121
  ```json
@@ -27,8 +27,8 @@ Skill: orchestrator
27
27
 
28
28
  Install to your project for persistent availability:
29
29
  ```bash
30
- cleo orchestrate skill --install # Copy to .cleo/skills/
31
- cleo orchestrate skill --verify # Verify installation
30
+ cleo skills install ct-orchestrator # install to your agent directory
31
+ cleo skills info ct-orchestrator # verify it resolves
32
32
  ```
33
33
 
34
34
  ## Files
@@ -2,8 +2,13 @@
2
2
  name: ct-orchestrator
3
3
  description: "Pipeline-aware orchestration skill for managing complex workflows through subagent delegation. Use when the user asks to \"orchestrate\", \"orchestrator mode\", \"run as orchestrator\", \"delegate to subagents\", \"coordinate agents\", \"spawn subagents\", \"multi-agent workflow\", \"context-protected workflow\", \"agent farm\", \"HITL orchestration\", \"pipeline management\", or needs to manage complex workflows by delegating work to subagents while protecting the main context window. Enforces ORC-001 through ORC-009 constraints. Provider-neutral — works with any AI agent runtime."
4
4
  metadata:
5
- version: 2.8.0
6
- lastReviewed: 2026-09-19
5
+ version: 4.0.4
6
+ tier: core
7
+ install: harness
8
+ covers:
9
+ - packages/cleo/src/cli/commands/orchestrate.ts
10
+ - packages/core/src/orchestration/spawn-prompt.ts
11
+ lastReviewed: 2026-09-28
7
12
  stability: stable
8
13
  ---
9
14
 
@@ -92,7 +97,7 @@ Runs **autonomously on every incoming issue**. Decomposes ideas into executable
92
97
  | **Specification** | Write formal spec with RFC 2119 language, acceptance criteria | Lead (reasoning) |
93
98
  | **Decomposition** | Break into atomic tasks with deps under epic(s) | Lead (reasoning) |
94
99
 
95
- **RCASD output**: Epic(s) with child tasks, spec documents attached, dependency graph defined, acceptance criteria on every task. Architecture decisions stored in BRAIN decision-store via `cleo memory store --type decision`, not in adrs markdown blobs.
100
+ **RCASD output**: Epic(s) with child tasks, spec documents attached, dependency graph defined, acceptance criteria on every task. Architecture decisions stored in BRAIN decision-store via `cleo memory decision-store --decision "..." --rationale "..."`, not in adrs markdown blobs.
96
101
 
97
102
  ### IVTR Phase (Execution)
98
103
 
@@ -135,7 +140,7 @@ Spawning is a **two-step pattern** — CLEO prepares the prompt, then the provid
135
140
 
136
141
  ```bash
137
142
  # Get next dependency-safe task
138
- cleo orchestrate ready --epic T1575
143
+ cleo orchestrate ready T1575
139
144
 
140
145
  # Generate fully-resolved spawn prompt
141
146
  cleo orchestrate spawn T1586 --json
@@ -176,7 +181,7 @@ After successful verification, subagents MUST return exactly one of:
176
181
  cleo session status # Resume existing?
177
182
  cleo dash # Project overview
178
183
  cleo current # Active task?
179
- cleo orchestrate start --epic T1575 # Full state: session, pipeline, next task
184
+ cleo orchestrate start T1575 # Full state: session, pipeline, next task
180
185
  ```
181
186
 
182
187
  ### 2. RCASD — Plan the Work
@@ -197,11 +202,12 @@ cleo orchestrate start --epic T1575 # Full state: session, pipeline, next task
197
202
  ### 3. IVTR — Execute the Work
198
203
 
199
204
  ```
200
- 1. Identify Wave 0: cleo orchestrate ready --epic T1575
201
- 2. Spawn Workers in parallel for each Wave 0 task
205
+ 1. Read the waves: cleo orchestrate waves T1575 (take each wave n from here;
206
+ numbers can skip and the first need not be 1), then cleo orchestrate ready T1575
207
+ 2. Spawn Workers in parallel for each ready task in the first incomplete wave
202
208
  3. On completion: read manifest, check acceptance criteria
203
209
  4. If criteria NOT met → re-spawn worker with feedback (IVTR loop)
204
- 5. Advance to Wave 1 (tasks whose deps are now done)
210
+ 5. Advance to the next wave cleo orchestrate waves lists (its deps are now done)
205
211
  6. Repeat until all tasks complete
206
212
  7. Final validation with Lead across the full epic
207
213
  ```
@@ -229,6 +235,23 @@ On an idle host every ready task is `admitted` and behaviour is unchanged.
229
235
  ### 4. Report to Human
230
236
 
231
237
  After each wave or on request: what completed, blockers needing HITL, next actions.
238
+ Report only when work is done or a decision is needed; no routine status chatter.
239
+
240
+ ## Asking the Owner (HITL ask tool)
241
+
242
+ Whenever the owner must answer, decide, approve or choose ANYTHING, ask through
243
+ the ask tool (`AskUserQuestion` in Claude Code, or the provider equivalent from
244
+ CAAMP's `PROVIDER_ASK_TOOLS`) with concrete, detailed, selectable options. Never
245
+ ask inside a response, and never bury a question or decision in prose. Each option
246
+ states what happens and its trade-offs, with the recommended option first.
247
+
248
+ - **Subagent relay.** Subagents never ask the human (most harnesses deny them the
249
+ ask tool). A subagent that needs a decision returns `blocked` with
250
+ `{question, options[{label, description}], recommended}` in its manifest entry;
251
+ you, the orchestrator, put that question to the owner via your ask tool, then
252
+ re-spawn or continue with the answer.
253
+ - **Fallback.** When your harness has no ask tool, emit one LAFS `hitl.request`
254
+ envelope `{question, options[{label, description}], recommended}` and stop.
232
255
 
233
256
  ## Handoff Chain Protocol
234
257
 
@@ -262,10 +285,10 @@ When operating without continuous HITL oversight, additional constraints apply:
262
285
 
263
286
  | Command | Purpose |
264
287
  |---------|---------|
265
- | `cleo orchestrate start --epic T1575` | Full startup: session + pipeline + next task |
266
- | `cleo orchestrate ready --epic T1575` | Parallel-safe tasks in current wave |
288
+ | `cleo orchestrate start T1575` | Full startup: session + pipeline + next task |
289
+ | `cleo orchestrate ready T1575` | Parallel-safe tasks in current wave |
267
290
  | `cleo orchestrate spawn T1586 --json` | Generate resolved spawn prompt |
268
- | `cleo orchestrate next --epic T1575` | Suggest next task |
291
+ | `cleo orchestrate next T1575` | Suggest next task |
269
292
  | `cleo saga rollup <sagaId>` | Cross-Epic status aggregation when orchestrating a multi-Epic Saga (ADR-073) |
270
293
  | `cleo saga members <sagaId>` | Member Epics of a Saga (parent_id containment — NOT `task_relations.groups`) |
271
294
  | `cleo pipeline stage.status --epic T1575` | Current pipeline stage |
@@ -8,8 +8,8 @@ Copy and include this block in EVERY subagent prompt spawned via Task tool.
8
8
  ## SUBAGENT PROTOCOL (RFC 2119 - MANDATORY)
9
9
 
10
10
  OUTPUT REQUIREMENTS:
11
- 1. MUST write findings to: {{OUTPUT_DIR}}/YYYY-MM-DD_{topic}.md
12
- 2. MUST append ONE entry via `cleo manifest append <json>` (writes to pipeline_manifest table per ADR-027/T1093)
11
+ 1. MUST record findings with `cleo docs add {{TASK_ID}} --content - --type <kind> --slug {{TOPIC_SLUG}}` (never a raw file under `.cleo/agent-outputs/`)
12
+ 2. MUST append ONE entry via `cleo manifest append --entry '<json>'` (writes to pipeline_manifest table per ADR-027/T1093)
13
13
  3. MUST return ONLY: "Research complete. Manifest appended to pipeline_manifest."
14
14
  4. MUST NOT return research content in response.
15
15
 
@@ -33,8 +33,8 @@ You are the {ROLE} subagent. Your job is to complete CLEO task {TASK_ID}.
33
33
 
34
34
  ## SUBAGENT PROTOCOL (RFC 2119 - MANDATORY)
35
35
  OUTPUT REQUIREMENTS:
36
- 1. MUST write findings to: {{OUTPUT_DIR}}/YYYY-MM-DD_{topic}.md
37
- 2. MUST append ONE entry via `cleo manifest append <json>` (writes to pipeline_manifest table per ADR-027/T1093)
36
+ 1. MUST record findings with `cleo docs add {{TASK_ID}} --content - --type <kind> --slug {{TOPIC_SLUG}}` (never a raw file under `.cleo/agent-outputs/`)
37
+ 2. MUST append ONE entry via `cleo manifest append --entry '<json>'` (writes to pipeline_manifest table per ADR-027/T1093)
38
38
  3. MUST return ONLY: "Research complete. Manifest appended to pipeline_manifest."
39
39
  4. MUST NOT return research content in response.
40
40
 
@@ -115,19 +115,19 @@ HANDOFF CONTENTS:
115
115
 
116
116
  ```bash
117
117
  # 1. Read last handoff
118
- cleo research list --type handoff --limit 1
118
+ cleo docs list --type handoff --project
119
119
 
120
120
  # 2. Verify session exists
121
- cleo session status <session_id>
121
+ cleo session show <session_id>
122
122
 
123
123
  # 3. Check for concurrent modifications
124
- cleo session list --scope epic:<epic_id>
124
+ cleo session list --status active
125
125
 
126
126
  # 4. Resume if clear
127
127
  cleo session resume <session_id>
128
128
 
129
129
  # 5. Continue from next_tasks
130
- cleo orchestrate next --epic <epic_id>
130
+ cleo orchestrate next <epic_id>
131
131
  ```
132
132
 
133
133
  ## Exit Codes
@@ -37,7 +37,7 @@ research_id="${topic_slug}-${date}" # e.g., "auth-research-2026-01-21"
37
37
  # 2. Verify manifest entry exists
38
38
  cleo research show "$research_id"
39
39
  # OR
40
- jq -s '.[] | select(.id == "'$research_id'")' "{{MANIFEST_PATH}}"
40
+ cleo manifest show "$research_id"
41
41
 
42
42
  # 3. Block on missing manifest - DO NOT spawn next agent until confirmed
43
43
  if ! cleo research show "$research_id" &>/dev/null; then
@@ -91,7 +91,7 @@ fi
91
91
 
92
92
  | Violation | Detection | Recovery |
93
93
  |-----------|-----------|----------|
94
- | Missing protocol block | `grep -q "SUBAGENT PROTOCOL"` fails | Re-inject via `cleo research inject` |
94
+ | Missing protocol block | `grep -q "SUBAGENT PROTOCOL"` fails | Regenerate the prompt with `cleo orchestrate spawn <taskId>` (it embeds the protocol) |
95
95
  | Invalid return message | Not in allowed format list | Mark as violation, re-spawn |
96
96
  | No manifest entry | `cleo research show` returns error | Re-spawn with explicit manifest requirement |
97
97
  | No research link | `jq '.task.linkedResearch'` empty | Orchestrator links via `cleo research link` |
@@ -240,7 +240,7 @@ if (( $(echo "$compliance_pass_rate < $COMPLIANCE_THRESHOLD" | bc -l) )); then
240
240
  stricter_prompt="$original_prompt
241
241
 
242
242
  ## COMPLIANCE CHECKLIST (VERIFY BEFORE RETURNING)
243
- - [ ] Output file exists at {{OUTPUT_DIR}}/{{DATE}}_{{TOPIC_SLUG}}.md
243
+ - [ ] Output recorded with `cleo docs add` (`cleo docs fetch <slug>` returns it)
244
244
  - [ ] pipeline_manifest entry appended via `cleo manifest append`
245
245
  - [ ] Return message is EXACTLY: 'Research complete. Manifest appended to pipeline_manifest.'
246
246
  - [ ] Task linked via: {{TASK_LINK_CMD}} {{TASK_ID}} <research-id>
@@ -21,14 +21,14 @@ cleo orchestrate spawn T1575 # Auto-detects epic → uses decomposition protoco
21
21
  cleo research show <research-id>
22
22
 
23
23
  # 5. Continue with wave-0 tasks
24
- cleo orchestrate next --epic T1575
24
+ cleo orchestrate next T1575
25
25
  ```
26
26
 
27
27
  ## Pattern: Resuming Interrupted Work
28
28
 
29
29
  ```bash
30
30
  # 1. Check state on conversation start
31
- cleo orchestrate start --epic T1575
31
+ cleo orchestrate start T1575
32
32
  # Shows: session active, current T1586, next task T1589
33
33
 
34
34
  # 2. Check for incomplete subagent work
@@ -36,7 +36,7 @@ cleo research pending
36
36
  # Shows: needs_followup: ["T1586"]
37
37
 
38
38
  # 3. Resume focused task or spawn followup
39
- cleo show T1586 --brief
39
+ cleo show T1586
40
40
  cleo orchestrate spawn T1586 # Re-spawn if needed
41
41
  ```
42
42
 
@@ -52,7 +52,7 @@ cleo add "Add error handling to auth" --parent T1586 --depends T1586
52
52
  cleo add "Write auth tests" --parent T1586 --depends T1586
53
53
 
54
54
  # 3. Spawn for new tasks
55
- cleo orchestrate next --epic T1575
55
+ cleo orchestrate next T1575
56
56
  cleo orchestrate spawn T1590
57
57
  ```
58
58
 
@@ -64,7 +64,7 @@ cleo orchestrate analyze T1575
64
64
  # Shows: Wave 0: T1578, T1580, T1582 (no deps)
65
65
 
66
66
  # 2. Verify parallel safety
67
- cleo orchestrate ready --epic T1575
67
+ cleo orchestrate ready T1575
68
68
  # Returns: ["T1578", "T1580", "T1582"]
69
69
 
70
70
  # 3. Spawn multiple subagents (different sessions)
@@ -84,13 +84,13 @@ cleo phase show
84
84
  # Returns: "core"
85
85
 
86
86
  # 2. Get tasks in current phase
87
- cleo orchestrate ready --epic T1575 --phase core
87
+ cleo orchestrate ready T1575
88
88
 
89
89
  # 3. Spawn within phase context
90
90
  cleo orchestrate spawn T1586
91
91
 
92
92
  # 4. When phase complete, advance
93
- cleo phases stats
93
+ cleo phase list
94
94
  cleo phase advance # Move to testing phase
95
95
  ```
96
96
 
@@ -125,18 +125,19 @@ cleo list --parent T1575 --status pending # Should be empty
125
125
 
126
126
  # 2. Run pre-release validation
127
127
  ./tests/run-all-tests.sh
128
- cleo validate
129
-
130
- # 3. Create and ship release
131
- cleo release create v0.85.0 --tasks T001,T002,T003
132
- cleo release ship v0.85.0 --bump-version --create-tag --push
133
-
134
- # Preview without changes:
135
- cleo release ship v0.85.0 --bump-version --dry-run
128
+ cleo check arch
129
+
130
+ # 3. Plan and open the release PR (ADR-065; merged through PRs, tagged explicitly)
131
+ cleo release plan v0.85.0 --tasks T001,T002,T003
132
+ cleo release open v0.85.0
133
+ cleo release pr-status v0.85.0
134
+ git tag -a v0.85.0 -m "Release v0.85.0" && git push origin v0.85.0
135
+ cleo release reconcile v0.85.0
136
136
  ```
137
137
 
138
- **IMPORTANT**: `dev/release-version.sh` is **DEPRECATED** (since v0.78.0).
139
- Always use `cleo release create` → `cleo release ship`.
138
+ **IMPORTANT**: `dev/release-version.sh` is **DEPRECATED** (since v0.78.0), and the
139
+ `release create`/`release ship` verbs were removed (T9540, T10103). Always use
140
+ `cleo release plan` → `open` → tag → `reconcile`.
140
141
 
141
142
  See `src/protocols/release.md` for the full release protocol specification.
142
143
 
@@ -158,7 +159,7 @@ cleo orchestrate spawn T105 # implementation protocol
158
159
  # contribution protocol auto-triggers for shared resources
159
160
 
160
161
  # RELEASE (polish phase)
161
- cleo release create v0.74.0 --tasks T104,T105
162
- cleo release ship v0.74.0 --bump-version --create-tag --push
162
+ cleo release plan v0.74.0 --tasks T104,T105
163
+ cleo release open v0.74.0
163
164
  cleo session end --note "Feature X released v0.74.0"
164
165
  ```