“Which rule applied?”
The instruction file says everything. The agent followed some of it. Nobody can say which rule shaped this change.
Graph engineering is how you design work in ConvOps: a graph of small workflows behind one door, which your agent walks one step at a time. The knowledge grows. The prompt does not.
one router · detours · fix loops · fragments · child tasks
One door
Designing the process as a graph of small workflows behind one router, which your agent walks one step at a time, instead of one giant prompt.
ConvOps is the operations layer for AI agents: an MCP server that holds your team's process as workflows, with approval gates, a shared memory and an audit trail. It runs no AI models.
updated
Every lesson becomes another paragraph in CLAUDE.md or AGENTS.md. The file grows, the agent reads less of it, and the process lives in prose.
“Which rule applied?”
The instruction file says everything. The agent followed some of it. Nobody can say which rule shaped this change.
“Why does it keep growing?”
Every incident adds a paragraph. The file gets longer, the agent skims more, and the next incident adds another.
“Where is the process?”
In prose. Steps, checks and exceptions mixed into one page that nobody can run, test or review.
The instruction file keeps who the agent is and one rule: follow the workflow. The process moves into workflows. The rules move into standards, read at the step that needs them.
Mark one workflow as the workspace router. New work starts on it. The agent triages, picks one of the exits and records why.
Workspace router
recorded waiting for the route decision
An exit can invoke a sub-workflow on the same task. The parent waits, then carries on. An exit without one just records the choice.
A failed review invokes a fix and returns to Verify. A person who rejects at an approval sends the run back to the step the workflow names.
The loop ends when the work passes. Every turn is saved, so any session picks the run up where it stopped.
Shared blocks like finding the standards, build and verify, and review live in fragments. Edit one, and every workflow that embeds it changes.
build-and-verify
Added to every workflow automatically. Nobody copies them in.
A parent splits into child tasks, each with its own workflow. Children that share an order start together. The next order starts on its own. The parent waits for all.
Add SSO to the admin app
Each step names the agent your orchestrator should use, and can name where it runs. It finds the standards for the files in scope. The agent gets one step.
Ask your AI client for the change. It edits the one step that needs it. No canvas, no code. Runs already in flight keep going.
Ask for the change you want.
One door per workspace. New work starts there and leaves by one exit.
is_router
Picks an exit and records why. A rule can match a task field instead.
decision · conditions
A detour on the same task. The parent waits, then carries on. Up to five levels deep.
invoke
Failed work returns to an earlier step and comes round again until it passes.
resume_at · on_rejected
Shared steps written once and embedded everywhere. Edit once, every workflow changes.
embed
The engine checks it. The run does not move until the condition is met or a person approves.
requires_approval
A parent splits into tasks with their own workflows. Same order starts together.
sequential_children
Rules live in files, found for the files in scope, read when the step needs them.
standards/
Every picture above is a few fields on a step. Here they are as the engine reads them.
Four conditions, each invoking a sub-workflow. The first matches a task field on its own; the others are picked by the agent, who records why.
// router · step "route" (example)
{
"id": "route",
"name": "Route decision",
"decision": true,
"instructions": "Pick the exit that fits. Say why.",
"conditions": [
{ "id": "feature", "name": "Larger initiative",
"when": { "task_field": "type", "equals": "initiative" },
"invoke": "feature-delivery" },
{ "id": "development", "name": "A code change",
"invoke": "development-mr" },
{ "id": "quick", "name": "Small, known pattern",
"invoke": "simple-task" },
{ "id": "ops", "name": "Infrastructure",
"invoke": "ops-task" }
]
}resume_at sends the return trip from the fix back to verify. on_rejected names where a person's rejection sends the run.
// development-mr · review loop (example)
{
"id": "review",
"name": "Review",
"decision": true,
"conditions": [
{ "id": "needs-fixes", "name": "Needs fixes",
"invoke": "fix" },
{ "id": "passed", "name": "Passed" }
],
"resume_at": "verify"
},
{
"id": "merge",
"name": "Approve the merge",
"gate": { "requires_approval": true },
"on_rejected": "build"
}An embed directive pulls a fragment's steps into the workflow. Edit the fragment and every workflow that embeds it changes.
// development-mr · steps (example)
[
{ "embed": "fragment", "id": "find-standards" },
{ "embed": "fragment", "id": "build-and-verify" },
{ "id": "review", "decision": true, ... },
{ "id": "merge", "gate": { "requires_approval": true } }
]
// capture-learnings and complete are added
// to every workflow by the workspace globalsA sequential_children gate routes the parent into its children by order. Children that share an order start together. The parent advances when all are done.
// feature-delivery · step "children" (example)
{
"id": "children",
"name": "Run the child tasks",
"gate": { "sequential_children": true }
}
// children, by order
// order 1 SSO data model development-mr
// order 1 Login screen design design-review
// order 2 Wire the login flow development-mr
// order 3 Docs simple-taskOne call marks a workflow as the workspace router. It needs a workspace owner or admin and is checked before anything is saved.
workflow_template_meta_update({
"template_id": "router",
"changes": { "is_router": true }
})
// owners and admins only
// every new task, bug, initiative and plan
// in this workspace now starts on "router"Designing how work gets done as a graph of small workflows instead of one giant prompt. One router takes every new task, decisions detour into sub-workflows and come back, loops send failed work round again, and shared fragments keep common steps in one place. Your agent walks the graph one step at a time.
Those are graphs that call APIs: you write code or wire nodes, and the framework calls models and services. Here ConvOps holds the graph and your AI session walks it. Claude Code, Codex, Cursor or any MCP client asks for the current step, does it and advances. Graphs your agents run, with no code to write.
No, by design. A decision either records a choice or detours into a sub-workflow that returns. A loop goes back to an earlier step the workflow names. Every path comes back to the line, so anyone can read the graph and know where a run can go.
The run goes back to the step the workflow names for a rejection, often the build or the fix step, and comes round again. The run does not move past the approval until a person approves it.
No. Without one, rules match new work to a workflow by type, area, tags and project. A router gives every new task, bug, initiative and plan one door, where the agent triages it and records why it went where it went.
Yes, in conversation. Ask for a review loop after the build and the AI edits that one step. Runs already in flight keep going. Marking a workflow as the workspace router is reserved for owners and admins.
No canvas. You describe the change from the AI client you already use, and every run follows the stored workflow. The graph is the steps, decisions and links the engine evaluates.