Skip to main content
ClaudeWave
Skill126 repo starsupdated 2d ago

workflow-orchestration

Написание и запуск Claude Code dynamic workflows (детерминированный JS-оркестратор субагентов, research preview 2026-05-28). Use when пишешь или запускаешь workflow, видишь keyword workflow в запросе, нужен fan-out на десятки-сотни агентов, codebase-wide аудит/миграция, cross-checked research, competency-review, batch-обработка списка элементов через стадии. Покрывает: примитивы phase/agent/parallel/pipeline/workflow, pipeline vs parallel, schema, budget, resume, quality-паттерны (adversarial verify, judge panel, loop-until-dry), и наши добавки к платформе (retry-обёртка, error policy, .runs observability, eval-harness, billing-дисциплина). Триггеры: workflow, воркфлоу, оркестратор, fan-out, ultracode, deep-research, 1000 агентов, детерминированный скрипт агентов.

Install in Claude Code
Copy
git clone --depth 1 https://github.com/AnastasiyaW/claude-code-config /tmp/workflow-orchestration && cp -r /tmp/workflow-orchestration/skills/development/workflow-orchestration ~/.claude/skills/workflow-orchestration
Then start a new Claude Code session; the skill loads automatically.

SKILL.md

# Workflow Orchestration

Claude Code **dynamic workflows** - детерминированный JS-скрипт, который оркестрирует
недетерминированных субагентов. Скрипт = «рельсы» (loop, branching, промежуточные
результаты в переменных); агенты = «поезда». Надёжность даёт код вокруг агентов, а не
агенты сами. Research preview с 2026-05-28, требует Claude Code v2.1.154+.

Этот skill - наш свод поверх официального API: что платформа уже даёт, и что мы
добавляем сами (5 gaps, выявленных практиком с 4 своими оркестраторами).

## Когда workflow, а когда нет

| | Subagent | Skill | Agent Team | **Workflow** |
|---|---|---|---|---|
| Что | воркер, спавнится разово | инструкции для Claude | сварм, коллаборация | **скрипт, исполняет runtime** |
| Кто решает что дальше | Claude, ход за ходом | Claude по промпту | Claude + обмен между агентами | **скрипт (детерминизм)** |
| Где промежуточные результаты | контекст Claude | контекст Claude | контекст Claude | **переменные скрипта** |
| Масштаб | пара задач/ход | как subagent | х2-х10 агентов | **десятки-сотни, лимит 1000** |
| Прерывание | рестарт хода | рестарт хода | рестарт хода | **resumable в той же сессии** |

**Бери workflow когда:** задаче нужно больше агентов, чем удержит один контекст; нужна
повторяемая оркестрация как читаемый скрипт; нужен repeatable quality-паттерн
(агенты adversarially проверяют находки друг друга перед тем как их вернуть).

**3-условный тест (все три ОДНОВРЕМЕННО, иначе custom subagent эффективнее):** (1) задача
больше одного контекстного окна; (2) стратегия разбиения заранее НЕ известна; (3) качество
важнее токен-экономики. Известный фиксированный флоу + нужна cost-предсказуемость → бери
subagent, не workflow.

**НЕ бери workflow когда:** хватает 1-3 субагентов на ход (бери subagent); задача -
следование инструкции (skill); нужен интерактивный sign-off в середине (workflow не
принимает user input в середине - каждый этап с sign-off = свой workflow).

**Opt-in обязателен.** Workflow tool вызывается только когда user явно дал согласие
(keyword `workflow`/`workflows` в запросе, ultracode on, или прямая просьба). Иначе -
обычные субагенты. Это и наше правило, и поведение платформы.

## Анатомия (точный API)

```js
export const meta = {                       // ПЕРВЫМ. Pure literal — без переменных,
  name: 'my-flow',                          // вызовов функций, спредов, интерполяции.
  description: 'one-liner для диалога approve',
  phases: [{ title: 'Scan', detail: '...' }, { title: 'Fix' }],  // = phase() вызовам
  whenToUse: '...',                         // опц., в списке /workflows
}
// тело — обычный async JS + примитивы:
phase('Scan')                               // группа прогресса; agent() ниже в неё
const r = await agent('prompt', {schema: S, label, phase, model, isolation, agentType})
const all = await parallel(items.map(x => () => agent(...)))   // БАРЬЕР, ждёт всех
const out = await pipeline(items, stageA, stageB)              // fan-out, БЕЗ барьера
const sub = await workflow('deep-research', {question})        // суб-воркфлоу, вложен. 1
log('сообщение пользователю')
```

- **`agent(prompt, opts?)`** → без `schema` возвращает финальный текст (string); со `schema`
  (JSON Schema) форсит StructuredOutput tool и возвращает **валидированный объект** (модель
  ретраит при mismatch); `null` если user скипнул агента. opts: `label`, `phase` (явная
  группа - юзать внутри parallel/pipeline, не глобальный phase()), `model` (опускать -
  наследует модель сессии; ставить только когда уверен), `isolation:'worktree'` (дорого -
  только когда агенты параллельно мутируют файлы), `agentType` ('Explore', 'code-reviewer'...).
- **`parallel(thunks)`** - массив **функций** `()=>Promise`, барьер. Упавший thunk → `null`
  (не реджект). Всегда `.filter(Boolean)` перед использованием.
- **`pipeline(items, ...stages)`** - каждый item независимо через все стадии, БЕЗ барьера
  между ними (item 2 на стадии 3, item 4 ещё на стадии 1). Стадия = `(prev, item, idx)=>...`.
  Стадия бросает → item = `null`, остальные стадии скип. **Дефолт для многостадийной работы.**
- **`budget`** `{total: number|null, spent(), remaining()}` - токен-таргет хода. `total`
  null если не задан. Хард-потолок: при достижении `agent()` бросает.
- **`args`** - значение, переданное в Workflow, дословно (для параметризованных команд).

## Золотые правила (L1 корректности)

1. **pipeline по умолчанию.** parallel-барьер - ТОЛЬКО когда стадия N реально нужна ВСЕ
   результаты N-1 разом (dedup по всему множеству, early-exit по总count, «сравни с
   остальными находками»). «Надо сначала flatten/filter» - делай это ВНУТРИ стадии pipeline.
2. **Никогда `Date.now()` / `Math.random()` / argless `new Date()`** - бросают (ломают
   journaling/resume). Таймстемпы - через `args`; «случайность» - варьируй prompt/label по `idx`.
3. **Скрипт НЕ имеет fs/shell.** Читают/пишут/запускают команды только агенты (у них Bash,
   Read, Write). Скрипт лишь координирует и передаёт данные через переменные.
4. **schema для всего, что обрабатываешь кодом.** Текст парсить нельзя надёжно - schema
   даёт валидированный объект + авто-ретрай.
5. **`.filter(Boolean)`** после каждого `parallel()` и после `pipeline()` (упавшие = null).
6. **meta - pure literal.** Любая вычисляемая часть = parse error.
7. **Субагенты всегда в `acceptEdits`** и наследуют твой tool allowlist. Перед запуском на
   боевом репо это надо понимать: правки файлов авто-одобряются.

## Лимиты рантайма (точные, reverse-eng — детали в `references/research-findings-2026-05-30.md`)

1000 `agent()` lifetime (`WorkflowAgentCapError`) · concurrency `min(16, max(2, cores−2))` ·
скрипт ≤512 KB · per-agent stall 180s (override опцией `stallMs`, до 5 retry) · nesting 1
уровень · **`agent()` cache key = (schema, model, isolation, agentType)** — смена любого =
повторный запуск этого вызова при resume.

## Quality-паттерны (повышают доверие к результату)

- **Adversarial verify** - на каждую находку N независимых скептиков, промпт «опровергни,
  по умолчанию r