Run each workflow stage as its own task, with fan-out and fan-in

This commit is contained in:
Ian Gulliver
2026-10-15 22:53:54 -07:00
parent f7a0ffcd4c
commit 2180a7e824
15 changed files with 739 additions and 408 deletions
+12 -5
View File
@@ -870,6 +870,10 @@ export interface components {
merge_queued_at?: string;
/** @description The name of the workflow the task froze at creation (getTaskWorkflow has its copy); absent for a task without one. */
workflow?: string;
/** @description With workflow: the id every task of one run of the workflow shares. */
workflow_run?: string;
/** @description With workflow: the name of the stage this task runs. */
workflow_stage?: string;
};
Todo: {
/** @description Whether the default branch has a TODO.md at its root. */
@@ -908,14 +912,12 @@ export interface components {
};
TaskCreate: {
title: string;
/** @description The name of a workflow for the task to freeze: it keeps a copy of the workflow's definition as it is now. */
workflow?: string;
};
WorkflowSummary: {
name: string;
description: string;
};
/** @description A workflow's file, which holds everything but its name: a sequence of stages run in order. Sent and returned as YAML. */
/** @description A workflow's file, which holds everything but its name: its stages, each run as its own task once the stages it comes after have finished. Sent and returned as YAML. */
WorkflowDefinition: {
description?: string;
stages: components["schemas"]["Stage"][];
@@ -923,6 +925,13 @@ export interface components {
Stage: {
/** @description One line of 1 to 100 characters, unique within the workflow. */
name: string;
/** @description The stages whose outputs this stage gets, by name; it starts once all of them have finished. Absent means the previous stage in the list (for the first stage, none); empty means it starts from the brief. */
after?: string[];
/**
* @description Where the stage's task branches from. parent (the default): the commit its one after stage finished at, or for a stage with none, where the workflow was started from. main: the project's default branch. Refused on a stage with more than one after stage, which always branches from the default branch.
* @enum {string}
*/
base?: "parent" | "main";
/** @description The stage agent's model, which also picks its vendor: gpt-* models run on Codex, every other model on Claude Code. */
model: string;
/** @description The stage agent's instructions. */
@@ -1072,8 +1081,6 @@ export interface components {
forked_from?: string;
/** @description With forked_from: the vendor's id of the last thing the fork keeps, a message for Claude Code, a turn for Codex. */
forked_at?: string;
/** @description The stage (from 1) of the task's workflow this session runs; absent for a session outside a workflow. */
workflow_stage?: number;
};
SessionCreate: {
prompt: string;