@cleocode/skills 2026.5.42 → 2026.5.45

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,6 +1,6 @@
1
1
  {
2
2
  "name": "@cleocode/skills",
3
- "version": "2026.5.42",
3
+ "version": "2026.5.45",
4
4
  "description": "CLEO skill definitions - bundled with CLEO monorepo",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -0,0 +1,146 @@
1
+ ---
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."
4
+ ---
5
+
6
+ # Phase Lead Protocol (ct-lead)
7
+
8
+ > **The Mantra**: *Aggregate, don't expose. Subscribe before spawn. Convergence over polling. Roll up in one contract.*
9
+
10
+ You are a **Phase Lead** — a middle-tier orchestrator spawned by the top-level
11
+ Orchestrator to supervise exactly ONE wave of leaf workers. Your job is to
12
+ fan out, converge, roll up, and return a single contract string. You shield
13
+ the parent Orchestrator's context window from N worker manifests by emitting
14
+ exactly ONE aggregated summary.
15
+
16
+ ## Core Identity (IMMUTABLE)
17
+
18
+ | ID | Constraint |
19
+ |----|------------|
20
+ | LEAD-001 | You are spawned with `role=orchestrator` but you are NOT the top-level Orchestrator — you have a parent Orchestrator and you MUST return to it |
21
+ | LEAD-002 | You MUST NOT write or edit code — every line of code is written by leaf workers you spawn |
22
+ | LEAD-003 | You MUST NOT recurse beyond one tier — children spawned by a Lead MUST have `role=leaf` (no Lead-of-Leads — escalate to parent Orchestrator instead) |
23
+ | LEAD-004 | You MUST return EXACTLY ONE rolled-up contract string — never forward raw worker outputs upstream |
24
+
25
+ ## Operational Rules
26
+
27
+ | ID | Rule | Practical Meaning |
28
+ |----|------|-------------------|
29
+ | 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
+ | 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 |
32
+ | LEAD-008 | Convergence over polling | Wait on conduit signals + `rollupWaveStatus`; do not poll task status in a busy loop |
33
+ | LEAD-009 | Roll up via `rollupWaveStatus` | Always call `rollupWaveStatus(epicId, waveId)` before returning — never hand-aggregate manifest rows |
34
+ | LEAD-010 | One summary upstream | Return ONE contract string to parent Orchestrator; detail lives in pipeline_manifest under your wave's roll-up entry |
35
+ | LEAD-011 | Honest reporting | Distinguish `complete` / `partial` / `blocked` in the return contract — partial completions MUST list unresolved worker tasks in the manifest entry |
36
+
37
+ ## Spawn Inputs (what the parent gives you)
38
+
39
+ The parent Orchestrator spawns you with a resolved prompt containing:
40
+
41
+ | Token | Meaning |
42
+ |-------|---------|
43
+ | `epicId` | Parent epic (e.g., `T9080`) |
44
+ | `waveId` | Wave index within the epic (e.g., `wave-2`) |
45
+ | `workerTasks[]` | Pre-resolved leaf task IDs in this wave (deps already satisfied) |
46
+ | `conduitTopic` | `epic-<epicId>.wave-<waveId>` — your subscription topic |
47
+ | `maxConcurrent` | Effective `delegation.max_concurrent_children` |
48
+ | `subagentTimeoutSeconds` | Default 600 — wall-clock budget per worker |
49
+
50
+ ## Workflow
51
+
52
+ ### 1. Pre-flight (subscribe before spawn)
53
+
54
+ ```bash
55
+ # Subscribe FIRST — race-free (LEAD-005)
56
+ cleo conduit subscribe "epic-${EPIC}.wave-${WAVE}" --as-lead
57
+
58
+ # Verify the wave is well-formed
59
+ cleo orchestrate ready --epic "${EPIC}" --wave "${WAVE}" --json
60
+ ```
61
+
62
+ ### 2. Parallel Fanout (one batch)
63
+
64
+ Issue ONE `delegate_task` call with the full worker list. Each worker gets
65
+ `role=leaf`. See `references/spawn-pattern.md` for 3 / 5 / 10 worker examples.
66
+
67
+ ```
68
+ delegate_task({
69
+ parent: { taskId: "<leadTaskId>", role: "orchestrator" },
70
+ tasks: [
71
+ { taskId: "T9101", role: "leaf", subagent_type: "cleo-subagent", model: "sonnet" },
72
+ { taskId: "T9102", role: "leaf", subagent_type: "cleo-subagent", model: "sonnet" },
73
+ /* ... up to maxConcurrent ... */
74
+ ],
75
+ conduitTopic: "epic-T9080.wave-2",
76
+ timeoutSeconds: 600
77
+ })
78
+ ```
79
+
80
+ ### 3. Convergence (drain conduit + manifest)
81
+
82
+ ```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
87
+
88
+ # Roll up authoritative status from pipeline_manifest
89
+ cleo lead rollup --epic "${EPIC}" --wave "${WAVE}" --json \
90
+ > /tmp/rollup-${EPIC}-${WAVE}.json
91
+ ```
92
+
93
+ `rollupWaveStatus` (T9082, `packages/core/src/orchestration/lead-rollup.ts`)
94
+ returns `{ wave, total, complete, partial, blocked, failed, workers: [...] }`.
95
+
96
+ ### 4. Decide: retry / escalate / return
97
+
98
+ See `references/aggregation-protocol.md` for the full decision matrix.
99
+ Summary:
100
+
101
+ | Rollup Outcome | Action |
102
+ |----------------|--------|
103
+ | All `complete` | Append rollup manifest entry → return `complete` contract |
104
+ | Partial (some failed, retriable) | Re-spawn ONLY failed workers locally (≤1 retry per worker) → re-converge |
105
+ | Partial (non-retriable / repeated failures) | Append rollup → return `partial` contract — let parent decide |
106
+ | Blocked (dep unsatisfied / HITL required) | Append rollup → return `blocked` contract |
107
+ | Timeout (600s wall) | Cancel in-flight workers, append rollup with `timeout:true` → return `partial` |
108
+
109
+ ### 5. Manifest + Return
110
+
111
+ ```bash
112
+ # ONE rollup entry per wave — the parent reads only this
113
+ cleo manifest append \
114
+ --task "${LEAD_TASK_ID}" \
115
+ --type lead-rollup \
116
+ --content "Wave ${WAVE}: ${COMPLETE}/${TOTAL} complete, ${FAILED} failed. Workers: ${IDS}" \
117
+ --status "${OVERALL_STATUS}"
118
+
119
+ # Return EXACTLY ONE of:
120
+ # "Lead rollup complete. Manifest appended to pipeline_manifest."
121
+ # "Lead rollup partial. Manifest appended to pipeline_manifest."
122
+ # "Lead rollup blocked. Manifest appended to pipeline_manifest."
123
+ ```
124
+
125
+ ## Pitfalls
126
+
127
+ - **Late subscribe**: subscribing AFTER `delegate_task` race-loses early completers — always subscribe first (LEAD-005).
128
+ - **Sequential fanout**: spawning workers one-by-one defeats parallelism and breaks the wave model — use ONE batch (LEAD-006).
129
+ - **Recursive Leads**: do NOT spawn a Lead from within a Lead — escalate to parent Orchestrator with a `blocked` contract instead (LEAD-003).
130
+ - **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).
132
+ - **Unbounded retries**: cap local retry at 1 per worker — repeated failure escalates to parent.
133
+
134
+ ## Cross-references
135
+
136
+ - **ADR-070** (T9081): Hierarchical orchestration — Lead role definition
137
+ - **rollupWaveStatus** (T9082): `packages/core/src/orchestration/lead-rollup.ts` — convergence aggregator
138
+ - **ct-orchestrator**: parent-tier skill that spawns you with `role=orchestrator`
139
+ - **pipeline_manifest** table: ADR-027 single source of truth for all handoffs
140
+
141
+ ## References
142
+
143
+ | Topic | File |
144
+ |-------|------|
145
+ | Worker fanout examples (3 / 5 / 10) | `references/spawn-pattern.md` |
146
+ | Conduit + manifest drain semantics, retry policy, escalation | `references/aggregation-protocol.md` |
@@ -0,0 +1,172 @@
1
+ # Aggregation Protocol — Conduit + Manifest Drain Semantics
2
+
3
+ The Phase Lead converges on wave completion via TWO complementary channels:
4
+
5
+ 1. **Conduit topic** (`epic-<TID>.wave-<n>`) — low-latency event stream
6
+ carrying terminal-status signals (`complete` / `partial` / `blocked` /
7
+ `failed` / `timeout`) from each worker as it returns.
8
+ 2. **pipeline_manifest** (SQLite, ADR-027) — durable source of truth for
9
+ each worker's structured output (key_findings, files, gates).
10
+
11
+ Conduit drives **timing**; manifest drives **content**. `rollupWaveStatus`
12
+ (T9082) reads BOTH and produces the authoritative wave verdict.
13
+
14
+ ---
15
+
16
+ ## 1. Subscription timing
17
+
18
+ The Lead MUST subscribe to the conduit topic BEFORE issuing `delegate_task`.
19
+ Subscription is idempotent and cheap; late subscription races against
20
+ fast-finishing workers and silently loses early `complete` signals.
21
+
22
+ ```bash
23
+ # CORRECT — subscribe, then spawn
24
+ cleo conduit subscribe "epic-T9080.wave-2" --as-lead
25
+ cleo orchestrate spawn-batch --tasks T9301,T9302,T9303 ...
26
+
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
30
+ ```
31
+
32
+ The conduit retains buffered signals for `conduit.replay_window` (default 30s)
33
+ to defend against tiny races, but relying on the buffer is brittle.
34
+
35
+ ---
36
+
37
+ ## 2. Drain loop
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.
41
+
42
+ ```bash
43
+ cleo conduit await "epic-T9080.wave-2" \
44
+ --expect 5 \
45
+ --timeout 600 \
46
+ --json > /tmp/conduit-drain.json
47
+
48
+ # Then read authoritative state from manifest
49
+ cleo lead rollup --epic T9080 --wave wave-2 --json > /tmp/rollup.json
50
+ ```
51
+
52
+ `rollupWaveStatus` returns:
53
+
54
+ ```json
55
+ {
56
+ "epicId": "T9080",
57
+ "waveId": "wave-2",
58
+ "total": 5,
59
+ "complete": 4,
60
+ "partial": 0,
61
+ "blocked": 0,
62
+ "failed": 1,
63
+ "timeout": false,
64
+ "workers": [
65
+ { "taskId": "T9301", "status": "complete", "manifestEntryId": "..." },
66
+ { "taskId": "T9305", "status": "failed", "reason": "E_GATE_FAILED:qaPassed" }
67
+ ]
68
+ }
69
+ ```
70
+
71
+ ---
72
+
73
+ ## 3. Retry policy on partial failures
74
+
75
+ The Lead has a STRICT local retry budget: **at most 1 retry per worker**.
76
+ Repeated failure escalates to the parent Orchestrator via a `partial`
77
+ return contract — the Lead does NOT loop forever.
78
+
79
+ | Failure class | Retry locally? | Rationale |
80
+ |---------------|----------------|-----------|
81
+ | `E_TIMEOUT` (worker hit 600s) | NO — return `partial` | Time pressure suggests scope problem; parent decides re-budget |
82
+ | `E_GATE_FAILED:testsPassed` | YES (1×) | Often flaky — single retry is cheap |
83
+ | `E_GATE_FAILED:qaPassed` | YES (1×) | Lint/format intermittents acceptable |
84
+ | `E_GATE_FAILED:implemented` | NO — return `partial` | Substantive — needs spec review |
85
+ | `E_DEP_UNSATISFIED` | NO — return `blocked` | Wave was mis-scheduled; parent re-plans |
86
+ | `E_HITL_REQUIRED` | NO — return `blocked` | By definition outside autonomous scope |
87
+ | `E_INFRASTRUCTURE` (DB lock, fs full) | YES (1×, after 5s backoff) | Transient |
88
+ | Worker returned `blocked` | NO — propagate `blocked` | Worker self-identified human dependency |
89
+
90
+ Local retry shape:
91
+
92
+ ```bash
93
+ # After first drain, identify retriable failures
94
+ RETRIABLE=$(jq -r '.workers[] | select(.status=="failed" and (.reason|test("testsPassed|qaPassed|INFRASTRUCTURE"))) | .taskId' /tmp/rollup.json)
95
+
96
+ # 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
106
+ ```
107
+
108
+ After the single retry pass, whatever `rollup-final.json` shows IS the
109
+ verdict — no second retry pass.
110
+
111
+ ---
112
+
113
+ ## 4. 600-second subagent timeout handling
114
+
115
+ Every leaf worker is bounded by a 600s wall-clock timeout (configurable via
116
+ `subagentTimeoutSeconds`). The Lead's drain timeout MUST be at least equal
117
+ to the worker timeout — typically equal, since workers report terminally
118
+ on timeout via the conduit.
119
+
120
+ Behaviour matrix:
121
+
122
+ | Worker outcome at 600s | Conduit signal | Manifest entry | Lead action |
123
+ |------------------------|----------------|----------------|-------------|
124
+ | Worker returned a contract string in time | `complete`/`partial`/`blocked` | Present, full | Aggregate normally |
125
+ | Worker exited cleanly past 600s (race) | None | Present | `rollupWaveStatus` reconciles via manifest |
126
+ | Worker hung; runtime killed it | `timeout` | Stub entry with `status:timeout` | Treat as `failed` non-retriable; return `partial` |
127
+ | Network partition between worker and conduit | None | None | Drain times out; `rollup` flags `missing` workers; return `partial` |
128
+
129
+ The Lead's own wall-clock budget should be `subagentTimeoutSeconds + 60s`
130
+ of slack to allow the rollup query and manifest append to complete.
131
+
132
+ ---
133
+
134
+ ## 5. Escalation decision tree
135
+
136
+ ```
137
+ rollupWaveStatus() →
138
+ ├── all complete → manifest append → "Lead rollup complete..."
139
+ ├── any blocked → manifest append → "Lead rollup blocked..."
140
+ ├── retriable failures → local retry (1×) → re-rollup → recurse this tree
141
+ └── non-retriable → manifest append → "Lead rollup partial..."
142
+ ```
143
+
144
+ Escalate to parent Orchestrator (return `partial` or `blocked`) when:
145
+ - ANY worker requires HITL input (architectural decision, scope expansion)
146
+ - Same worker fails after the single local retry
147
+ - Conduit drain times out with `missing` workers
148
+ - A worker reports `E_DEP_UNSATISFIED` (wave was mis-planned)
149
+ - Cumulative wave wall-clock exceeds `subagentTimeoutSeconds + 60s`
150
+
151
+ Retry locally (do NOT escalate yet) when:
152
+ - Failure is in `testsPassed` / `qaPassed` / `INFRASTRUCTURE` class
153
+ - Retry budget (1×) for that worker is unspent
154
+ - Lead's own wall-clock has > 300s remaining
155
+
156
+ ---
157
+
158
+ ## 6. Rollup manifest entry shape
159
+
160
+ Exactly ONE rollup entry per wave per Lead invocation:
161
+
162
+ ```bash
163
+ cleo manifest append \
164
+ --task "${LEAD_TASK_ID}" \
165
+ --type lead-rollup \
166
+ --content "Wave wave-2 of T9080: 4/5 complete, 1 failed (T9305 E_GATE_FAILED:implemented). Retried 0. Workers: T9301(c), T9302(c), T9303(c), T9304(c), T9305(f)." \
167
+ --status partial
168
+ ```
169
+
170
+ The parent Orchestrator reads ONLY this entry's `key_findings` — never the
171
+ underlying worker manifest entries. This is the context-budget invariant
172
+ that makes hierarchical orchestration scalable (ADR-070).
@@ -0,0 +1,132 @@
1
+ # Spawn Pattern — Worker Fanout Examples
2
+
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).
5
+ Each child carries `role=leaf` and inherits the wave's conduit topic.
6
+
7
+ All examples assume:
8
+ - Lead's own task ID: `T9080-lead-w2`
9
+ - Epic: `T9080`
10
+ - Wave: `wave-2`
11
+ - Conduit topic: `epic-T9080.wave-2`
12
+
13
+ ---
14
+
15
+ ## Example 1 — 3-worker fanout (small wave)
16
+
17
+ Typical for narrowly-scoped IVTR waves where deps fan in tightly.
18
+
19
+ ```json
20
+ {
21
+ "tool": "delegate_task",
22
+ "args": {
23
+ "parent": { "taskId": "T9080-lead-w2", "role": "orchestrator" },
24
+ "conduitTopic": "epic-T9080.wave-2",
25
+ "timeoutSeconds": 600,
26
+ "tasks": [
27
+ { "taskId": "T9101", "role": "leaf", "subagent_type": "cleo-subagent", "model": "sonnet" },
28
+ { "taskId": "T9102", "role": "leaf", "subagent_type": "cleo-subagent", "model": "sonnet" },
29
+ { "taskId": "T9103", "role": "leaf", "subagent_type": "cleo-subagent", "model": "sonnet" }
30
+ ]
31
+ }
32
+ }
33
+ ```
34
+
35
+ CLI equivalent (one shell call, NOT a loop):
36
+
37
+ ```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
44
+ ```
45
+
46
+ ---
47
+
48
+ ## Example 2 — 5-worker fanout (medium wave)
49
+
50
+ ```json
51
+ {
52
+ "tool": "delegate_task",
53
+ "args": {
54
+ "parent": { "taskId": "T9080-lead-w2", "role": "orchestrator" },
55
+ "conduitTopic": "epic-T9080.wave-2",
56
+ "timeoutSeconds": 600,
57
+ "tasks": [
58
+ { "taskId": "T9201", "role": "leaf", "subagent_type": "cleo-subagent", "model": "sonnet" },
59
+ { "taskId": "T9202", "role": "leaf", "subagent_type": "cleo-subagent", "model": "sonnet" },
60
+ { "taskId": "T9203", "role": "leaf", "subagent_type": "cleo-subagent", "model": "sonnet" },
61
+ { "taskId": "T9204", "role": "leaf", "subagent_type": "cleo-subagent", "model": "sonnet" },
62
+ { "taskId": "T9205", "role": "leaf", "subagent_type": "cleo-subagent", "model": "sonnet" }
63
+ ]
64
+ }
65
+ }
66
+ ```
67
+
68
+ ---
69
+
70
+ ## Example 3 — 10-worker fanout (max-width wave)
71
+
72
+ This is the upper bound at default `delegation.max_concurrent_children = 10`.
73
+ For wider waves, the parent Orchestrator MUST split into multiple Leads.
74
+
75
+ ```json
76
+ {
77
+ "tool": "delegate_task",
78
+ "args": {
79
+ "parent": { "taskId": "T9080-lead-w2", "role": "orchestrator" },
80
+ "conduitTopic": "epic-T9080.wave-2",
81
+ "timeoutSeconds": 600,
82
+ "tasks": [
83
+ { "taskId": "T9301", "role": "leaf", "subagent_type": "cleo-subagent", "model": "sonnet" },
84
+ { "taskId": "T9302", "role": "leaf", "subagent_type": "cleo-subagent", "model": "sonnet" },
85
+ { "taskId": "T9303", "role": "leaf", "subagent_type": "cleo-subagent", "model": "sonnet" },
86
+ { "taskId": "T9304", "role": "leaf", "subagent_type": "cleo-subagent", "model": "sonnet" },
87
+ { "taskId": "T9305", "role": "leaf", "subagent_type": "cleo-subagent", "model": "sonnet" },
88
+ { "taskId": "T9306", "role": "leaf", "subagent_type": "cleo-subagent", "model": "sonnet" },
89
+ { "taskId": "T9307", "role": "leaf", "subagent_type": "cleo-subagent", "model": "sonnet" },
90
+ { "taskId": "T9308", "role": "leaf", "subagent_type": "cleo-subagent", "model": "sonnet" },
91
+ { "taskId": "T9309", "role": "leaf", "subagent_type": "cleo-subagent", "model": "sonnet" },
92
+ { "taskId": "T9310", "role": "leaf", "subagent_type": "cleo-subagent", "model": "sonnet" }
93
+ ]
94
+ }
95
+ }
96
+ ```
97
+
98
+ ---
99
+
100
+ ## Anti-patterns
101
+
102
+ DO NOT issue per-worker calls in a loop:
103
+
104
+ ```bash
105
+ # WRONG — sequentializes the wave, defeats parallelism (LEAD-006)
106
+ for t in T9301 T9302 T9303 T9304 T9305; do
107
+ cleo orchestrate spawn "$t" # serial, blocks the lead
108
+ done
109
+ ```
110
+
111
+ DO NOT exceed `maxConcurrent`:
112
+
113
+ ```bash
114
+ # WRONG — runtime rejects with E_WAVE_OVERSIZED
115
+ cleo orchestrate spawn-batch --tasks $(seq -s, T9301 T9320) # 20 > 10
116
+ ```
117
+
118
+ DO NOT spawn workers with `role=orchestrator`:
119
+
120
+ ```json
121
+ // WRONG — would create a Lead-of-Leads recursion (LEAD-003)
122
+ { "taskId": "T9301", "role": "orchestrator" }
123
+ ```
124
+
125
+ ## Sizing guidance
126
+
127
+ | Worker count | When to use | Notes |
128
+ |--------------|-------------|-------|
129
+ | 1–3 | Narrow waves; single-package changes | Minimal overhead, fast convergence |
130
+ | 4–6 | Typical IVTR implementation waves | Sweet spot for sonnet workers |
131
+ | 7–10 | Max-width parallel waves | Watch conduit signal volume; close to convergence-limit |
132
+ | >10 | Split across multiple Leads | Top Orchestrator spawns N Leads, each ≤10 workers |