[{"data":1,"prerenderedAt":31},["ShallowReactive",2],{"doc:en:workflows":3},{"title":4,"lede":5,"html":6,"headings":7},"A project’s workflows","A workflow is the series of steps your agents follow in a project (GSD, Superpowers, a PROMPT.md loop…). Escouade reads it on your machine, spending nothing, and says where each agent is. This page says what it can follow of each harness and what the MCP server gives of it.","\u003Cdiv class=\"callout note\">\u003Cp class=\"callout-title\">Note\u003C\u002Fp>\u003Cp>The word is “workflow”. A “loop” stays a ticket’s turn (“loop 2\u002F5”), and a step back in a workflow is called a return.\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003Ch2 id=\"what-escouade-reads\">What Escouade reads\u003C\u002Fh2>\n\u003Cp>Escouade asks nothing of the agent. It reads each harness’s commands (\u003Ccode class=\"key\">.claude\u002Fcommands\u003C\u002Fcode>), skills, sub-agents and prompts (\u003Ccode class=\"key\">.claude\u002F\u003C\u002Fcode>, all of \u003Ccode class=\"key\">.agents\u002F\u003C\u002Fcode>, \u003Ccode class=\"key\">.github\u002F\u003C\u002Fcode>, \u003Ccode class=\"key\">.opencode\u002F\u003C\u002Fcode>, \u003Ccode class=\"key\">.cursor\u002F\u003C\u002Fcode>), under the project’s folder and in the harnesses’ own folders, then the state files the steps write (\u003Ccode class=\"key\">.planning\u002FSTATE.md\u003C\u002Fcode>, \u003Ccode class=\"key\">fix_plan.md\u003C\u002Fcode>…). A workflow is at least two steps that point at each other, or a prompt played again; a command alone (\u003Ccode class=\"key\">\u002Fcommit\u003C\u002Fcode>) is not one.\u003C\u002Fp>\n\u003Cp>For each workflow it keeps:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>its \u003Cstrong>doors\u003C\u002Fstrong>: the commands or skills one goes in by;\u003C\u002Fli>\n\u003Cli>its \u003Cstrong>steps\u003C\u002Fstrong>, each with its command, its sub-agents and the files it reads and writes;\u003C\u002Fli>\n\u003Cli>its \u003Cstrong>returns\u003C\u002Fstrong>: a way back to a step already passed, with the line that says when and the most times;\u003C\u002Fli>\n\u003Cli>its \u003Cstrong>state files\u003C\u002Fstrong>, and what they say (“phase 3 of 6”, “12 boxes checked of 20”);\u003C\u002Fli>\n\u003Cli>its \u003Cstrong>exit condition\u003C\u002Fstrong>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>A project of several repositories has the workflow of each repository. The reading is made again when a file it read changes, and on demand.\u003C\u002Fp>\n\u003Ch2 id=\"where-it-is-kept\">Where it is kept\u003C\u002Fh2>\n\u003Cp>What Escouade understands of a workflow of the repository’s configuration (its entries, its steps, their sub-agents, its ways back, its state files) and your corrections are kept in the repository, a file per workflow in \u003Ccode class=\"key\">.escouade\u002Fworkflows\u002F\u003C\u002Fcode>, beside the \u003Ca href=\"\u002Fen\u002Fdocs\u002Fshared-board\u002F\">shared tickets\u003C\u002Fa>. Escouade writes these files and keeps them up to date, but never commits them: commit them with your work, and the whole team that uses Escouade sees the same workflows and the same corrections. A workflow is the repository’s when its entry is, even when a step calls a skill of your own folders (it is named as it is).\u003C\u002Fp>\n\u003Cul>\n\u003Cli>The files keep nothing of one machine: no date, no absolute path, no state of the work (“phase 3 of 6” is read again on the spot). A reading that changes nothing does not touch them.\u003C\u002Fli>\n\u003Cli>The folder is what counts: a teammate whose machine does not read a workflow still sees and follows it. A reading adds a new workflow and updates one that changed, never deleting a file; a workflow is set apart by “This is not a workflow” (its file keeps it marked), or its file deleted by “Remove from the repository”.\u003C\u002Fli>\n\u003Cli>The files are read again when they change (a \u003Ccode>git pull\u003C\u002Fcode>, another branch); a file that can’t be read is said with its path and why.\u003C\u002Fli>\n\u003Cli>The workflows of your own folders (\u003Ccode class=\"key\">~\u002F.claude\u003C\u002Fcode>, \u003Ccode class=\"key\">~\u002F.codex\u003C\u002Fcode>, GSD or Superpowers installed there) are read, shown and followed the same way, but their file stays on your machine, in \u003Ccode>~\u002F.escouade\u002Fprojects\u002F&lt;id&gt;\u002Fworkflows\u002F\u003C\u002Fcode>, never in the repository. “On this machine”, in Settings › Projects › Workflow, keeps the repository’s there too.\u003C\u002Fli>\n\u003Cli>The agents’ history in the workflows stays on your machine, in Escouade’s data folder.\u003C\u002Fli>\n\u003Cli>The format is described by a JSON schema: \u003Ccode>https:\u002F\u002Fescouade.dev\u002Fschemas\u002Fescouade-workflow.schema.json\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"where-each-agent-is\">Where each agent is\u003C\u002Fh2>\n\u003Cp>Each agent is placed by what it does: the door it typed, the sub-agents it launches, the skills it calls, the state files it writes, the end of its turns. A step begins at the first fact that signals it and ends at the first fact of another; its duration and cost are those of the turns between the two.\u003C\u002Fp>\n\u003Cp>Every stay in a step is kept in the agent’s history: the time, the duration, the cost, what was done in it, the outcome, and for a return, the reason the step gives. The history is kept with the agent after a restart. An agent that does something else (its message comes from no door and its tools signal no step) is “outside the workflow” until the next door.\u003C\u002Fp>\n\u003Ch2 id=\"what-each-harness-lets-be-followed\">What each harness lets be followed\u003C\u002Fh2>\n\u003Cdiv class=\"table\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Harness\u003C\u002Fth>\n\u003Cth>The step\u003C\u002Fth>\n\u003Cth>The sub-agent running\u003C\u002Fth>\n\u003Cth>The cost per step\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>Claude Code (conversation)\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Claude Code (Claude Code view)\u003C\u002Ftd>\n\u003Ctd>yes, by its hooks\u003C\u002Ftd>\n\u003Ctd>yes, by its hooks\u003C\u002Ftd>\n\u003Ctd>at the end of the turn\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>OpenCode\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Copilot CLI\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>the turn’s cost, as the account’s plan gives it\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Codex\u003C\u002Ftd>\n\u003Ctd>by its prompts and the state files\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>per turn\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Cursor CLI\u003C\u002Ftd>\n\u003Ctd>by its commands and the state files\u003C\u002Ftd>\n\u003Ctd>yes, as far as ACP tells\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Cursor CLI (Cursor view)\u003C\u002Ftd>\n\u003Ctd>by its transcript, a few seconds behind\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>A partial tracking is said so in the window (“Partial tracking”), with what is missing. Nothing is made up: what a harness does not show is not guessed.\u003C\u002Fp>\n\u003Cp>Three things seen for real: a door the agent runs by itself (Claude Code calls \u003Ccode class=\"key\">\u002Fecrire\u003C\u002Fcode> with its \u003Ccode class=\"key\">Skill\u003C\u002Fcode> tool within the turn of \u003Ccode class=\"key\">\u002Fetude\u003C\u002Fcode>) counts as a door, so the step follows without you typing the second one; the cost of a local model (OpenCode on Ollama) is $0, which is not a gap in the tracking; and in the Cursor view, a typed command is recognised even though the interface replaces it with its file.\u003C\u002Fp>\n\u003Ch2 id=\"through-the-mcp-server\">Through the MCP server\u003C\u002Fh2>\n\u003Cp>Three tools, all read only (see \u003Ca href=\"\u002Fen\u002Fdocs\u002Fmcp\u002F\">the MCP server\u003C\u002Fa> for the others):\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>\u003Ccode class=\"key\">get_workflow\u003C\u002Fcode>\u003C\u002Fstrong> (\u003Ccode class=\"key\">project\u003C\u002Fcode>): the project’s workflows, as the Workflow tab shows them. For each one, its doors, its steps (command, sub-agents, files read and written), its returns (\u003Ccode class=\"key\">back\u003C\u002Fcode>, with their \u003Ccode class=\"key\">condition\u003C\u002Fcode> and \u003Ccode class=\"key\">max\u003C\u002Fcode>) and, on each step, the agents on it now (\u003Ccode class=\"key\">agentsHere\u003C\u002Fcode>: id, name, since when, nth stay). Agents that follow a workflow without being on a step are apart (\u003Ccode class=\"key\">agentsElsewhere\u003C\u002Fcode>).\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ccode class=\"key\">list_agents\u003C\u002Fcode>\u003C\u002Fstrong>: each agent gains \u003Ccode class=\"key\">workflow\u003C\u002Fcode>, its name, step, turn (that of a prompt played again, or its ticket’s loop) and since when; \u003Ccode class=\"key\">null\u003C\u002Fcode> when it follows none.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ccode class=\"key\">get_agent_summary\u003C\u002Fcode>\u003C\u002Fstrong>: the same \u003Ccode class=\"key\">workflow\u003C\u002Fcode>, and the history of its steps (\u003Ccode class=\"key\">history\u003C\u002Fcode>, the latest 100 stays, oldest first).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>An agent does not put itself in a step through a tool: it enters one by doing the work, and that is what these tools read. Nothing more is exposed than the tab shows: never a file of the project, nor a conversation.\u003C\u002Fp>\n\u003Ch3 id=\"private-projects\">Private projects\u003C\u002Fh3>\n\u003Cp>A \u003Ca href=\"\u002Fen\u002Fdocs\u002Fsettings-projects\u002F\">private project\u003C\u002Fa> says nothing of its workflows to the agents of other projects: \u003Ccode class=\"key\">get_workflow\u003C\u002Fcode> does not find it (in the same words as a project that does not exist), and its agents, their step and their history appear in no list of the others. Its own agents see it alone.\u003C\u002Fp>\n\u003Ch2 id=\"see-also\">See also\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Ca href=\"\u002Fen\u002Fdocs\u002Fmcp\u002F\">The MCP server\u003C\u002Fa>: every tool, and what an Escouade agent sees.\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"\u002Fen\u002Fdocs\u002Fplan\u002F\">The Plan banner\u003C\u002Fa>: an agent’s task list and sub-agents, which complete its step.\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"\u002Fen\u002Fdocs\u002Fharness\u002F\">The harnesses\u003C\u002Fa>: what each one can do.\u003C\u002Fli>\n\u003C\u002Ful>\n",[8,12,15,18,21,24,28],{"id":9,"text":10,"depth":11},"what-escouade-reads","What Escouade reads",2,{"id":13,"text":14,"depth":11},"where-it-is-kept","Where it is kept",{"id":16,"text":17,"depth":11},"where-each-agent-is","Where each agent is",{"id":19,"text":20,"depth":11},"what-each-harness-lets-be-followed","What each harness lets be followed",{"id":22,"text":23,"depth":11},"through-the-mcp-server","Through the MCP server",{"id":25,"text":26,"depth":27},"private-projects","Private projects",3,{"id":29,"text":30,"depth":11},"see-also","See also",1793278986304]