[{"data":1,"prerenderedAt":1188},["ShallowReactive",2],{"navigation_docs":3,"-build-plugins-flows":320,"-build-plugins-flows-surround":1183},[4,35,69,109,133,193,228,262,305],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting started",false,"\u002Fgetting-started","1.getting-started",[10,15,20,25,30],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-ph-house",{"title":16,"path":17,"stem":18,"icon":19},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F2.quickstart","i-ph-rocket-launch",{"title":21,"path":22,"stem":23,"icon":24},"Concepts","\u002Fgetting-started\u002Fconcepts","1.getting-started\u002F3.concepts","i-ph-book-open",{"title":26,"path":27,"stem":28,"icon":29},"Install","\u002Fgetting-started\u002Finstall","1.getting-started\u002F4.install","i-ph-download-simple",{"title":31,"path":32,"stem":33,"icon":34},"What works today","\u002Fgetting-started\u002Fstatus","1.getting-started\u002F5.status","i-ph-list-checks",{"title":21,"icon":6,"path":36,"stem":37,"children":38,"page":6},"\u002Fconcepts","2.concepts",[39,44,49,54,59,64],{"title":40,"path":41,"stem":42,"icon":43},"Architecture","\u002Fconcepts\u002Farchitecture","2.concepts\u002F1.architecture","i-ph-planet",{"title":45,"path":46,"stem":47,"icon":48},"Jobs and durability","\u002Fconcepts\u002Fjobs","2.concepts\u002F2.jobs","i-ph-infinity",{"title":50,"path":51,"stem":52,"icon":53},"Routing","\u002Fconcepts\u002Frouting","2.concepts\u002F3.routing","i-ph-path",{"title":55,"path":56,"stem":57,"icon":58},"Security model","\u002Fconcepts\u002Fsecurity","2.concepts\u002F4.security","i-ph-shield-check",{"title":60,"path":61,"stem":62,"icon":63},"Tenants","\u002Fconcepts\u002Ftenants","2.concepts\u002F5.tenants","i-ph-buildings",{"title":65,"path":66,"stem":67,"icon":68},"Temporal","\u002Fconcepts\u002Ftemporal","2.concepts\u002F6.temporal","i-ph-clock",{"title":70,"icon":6,"path":71,"stem":72,"children":73,"page":6},"Run a fleet","\u002Ffleet","3.fleet",[74,79,84,89,94,99,104],{"title":75,"path":76,"stem":77,"icon":78},"Dev mode","\u002Ffleet\u002Fdev-mode","3.fleet\u002F1.dev-mode","i-ph-laptop",{"title":80,"path":81,"stem":82,"icon":83},"Run a cluster","\u002Ffleet\u002Fcluster","3.fleet\u002F2.cluster","i-ph-hard-drives",{"title":85,"path":86,"stem":87,"icon":88},"Join nodes","\u002Ffleet\u002Fjoin-nodes","3.fleet\u002F3.join-nodes","i-ph-plugs-connected",{"title":90,"path":91,"stem":92,"icon":93},"Manage nodes","\u002Ffleet\u002Fmanage-nodes","3.fleet\u002F4.manage-nodes","i-ph-list-bullets",{"title":95,"path":96,"stem":97,"icon":98},"Secrets","\u002Ffleet\u002Fsecrets","3.fleet\u002F5.secrets","i-ph-key",{"title":100,"path":101,"stem":102,"icon":103},"High availability","\u002Ffleet\u002Fhigh-availability","3.fleet\u002F6.high-availability","i-ph-copy",{"title":105,"path":106,"stem":107,"icon":108},"Upgrades, backups and restores","\u002Ffleet\u002Fupgrades","3.fleet\u002F7.upgrades","i-ph-arrows-clockwise",{"title":110,"icon":6,"path":111,"stem":112,"children":113,"page":6},"Use plugins","\u002Fplugins","4.plugins",[114,119,124,128],{"title":115,"path":116,"stem":117,"icon":118},"What a plugin is","\u002Fplugins\u002Foverview","4.plugins\u002F1.overview","i-ph-puzzle-piece",{"title":120,"path":121,"stem":122,"icon":123},"Install and update","\u002Fplugins\u002Finstall","4.plugins\u002F2.install","i-ph-package",{"title":125,"path":126,"stem":127,"icon":123},"Existing MCP packages","\u002Fplugins\u002Fpackages","4.plugins\u002F3.packages",{"title":129,"path":130,"stem":131,"icon":132},"The catalog","\u002Fplugins\u002Fcatalog","4.plugins\u002F4.catalog","i-ph-books",{"title":134,"icon":6,"path":135,"stem":136,"children":137,"page":6},"Build plugins","\u002Fbuild-plugins","5.build-plugins",[138,143,148,153,158,163,168,173,178,183,188],{"title":139,"path":140,"stem":141,"icon":142},"Your first plugin","\u002Fbuild-plugins\u002Ffirst-plugin","5.build-plugins\u002F1.first-plugin","i-ph-hammer",{"title":144,"path":145,"stem":146,"icon":147},"Harnesses","\u002Fbuild-plugins\u002Fharnesses","5.build-plugins\u002F10.harnesses","i-ph-cpu",{"title":149,"path":150,"stem":151,"icon":152},"Example: support triage","\u002Fbuild-plugins\u002Fexample-support-triage","5.build-plugins\u002F11.example-support-triage","i-ph-lifebuoy",{"title":154,"path":155,"stem":156,"icon":157},"Tools","\u002Fbuild-plugins\u002Ftools","5.build-plugins\u002F2.tools","i-ph-wrench",{"title":159,"path":160,"stem":161,"icon":162},"Agents","\u002Fbuild-plugins\u002Fagents","5.build-plugins\u002F3.agents","i-ph-robot",{"title":164,"path":165,"stem":166,"icon":167},"Skills","\u002Fbuild-plugins\u002Fskills","5.build-plugins\u002F4.skills","i-ph-graduation-cap",{"title":169,"path":170,"stem":171,"icon":172},"Develop and test","\u002Fbuild-plugins\u002Fdevelop-and-test","5.build-plugins\u002F5.develop-and-test","i-ph-flask",{"title":174,"path":175,"stem":176,"icon":177},"Publish and version","\u002Fbuild-plugins\u002Fpublish","5.build-plugins\u002F6.publish","i-ph-tag",{"title":179,"path":180,"stem":181,"icon":182},"Hooks","\u002Fbuild-plugins\u002Fhooks","5.build-plugins\u002F7.hooks","i-ph-anchor",{"title":184,"path":185,"stem":186,"icon":187},"Flows","\u002Fbuild-plugins\u002Fflows","5.build-plugins\u002F8.flows","i-ph-flow-arrow",{"title":189,"path":190,"stem":191,"icon":192},"Evals and quality gates","\u002Fbuild-plugins\u002Fevals","5.build-plugins\u002F9.evals","i-ph-seal-check",{"title":194,"icon":6,"path":195,"stem":196,"children":197,"page":6},"Run agents","\u002Fagents","6.agents",[198,203,208,213,218,223],{"title":199,"path":200,"stem":201,"icon":202},"Run jobs","\u002Fagents\u002Frun-jobs","6.agents\u002F1.run-jobs","i-ph-play",{"title":204,"path":205,"stem":206,"icon":207},"Models and keys","\u002Fagents\u002Fmodels-and-keys","6.agents\u002F2.models-and-keys","i-ph-sparkle",{"title":209,"path":210,"stem":211,"icon":212},"Delegation","\u002Fagents\u002Fdelegation","6.agents\u002F3.delegation","i-ph-git-fork",{"title":214,"path":215,"stem":216,"icon":217},"Contracts and limits","\u002Fagents\u002Fcontracts-and-limits","6.agents\u002F4.contracts-and-limits","i-ph-ruler",{"title":219,"path":220,"stem":221,"icon":222},"Runtime API","\u002Fagents\u002Fruntime-api","6.agents\u002F5.runtime-api","i-ph-plug",{"title":224,"path":225,"stem":226,"icon":227},"Approvals","\u002Fagents\u002Fapprovals","6.agents\u002F6.approvals","i-ph-hand-palm",{"title":229,"icon":6,"path":230,"stem":231,"children":232,"page":6},"Monitor","\u002Fmonitor","7.monitor",[233,238,243,248,253,258],{"title":234,"path":235,"stem":236,"icon":237},"Web UI","\u002Fmonitor\u002Fweb-ui","7.monitor\u002F0.web-ui","i-ph-monitor",{"title":239,"path":240,"stem":241,"icon":242},"Cost and usage","\u002Fmonitor\u002Fcost-and-usage","7.monitor\u002F1.cost-and-usage","i-ph-coins",{"title":244,"path":245,"stem":246,"icon":247},"Node health","\u002Fmonitor\u002Fnodes","7.monitor\u002F2.nodes","i-ph-heartbeat",{"title":249,"path":250,"stem":251,"icon":252},"Job history","\u002Fmonitor\u002Fhistory","7.monitor\u002F3.history","i-ph-clock-counter-clockwise",{"title":254,"path":255,"stem":256,"icon":257},"Tracing and metrics","\u002Fmonitor\u002Fobservability","7.monitor\u002F4.observability","i-ph-chart-line",{"title":259,"path":260,"stem":261,"icon":152},"Troubleshooting","\u002Fmonitor\u002Ftroubleshooting","7.monitor\u002F5.troubleshooting",{"title":263,"icon":6,"path":264,"stem":265,"children":266,"page":6},"Reference","\u002Freference","8.reference",[267,281,286,290,295,300],{"title":268,"icon":269,"path":270,"stem":271,"children":272,"page":6},"CLI","i-ph-terminal-window","\u002Freference\u002Fcli","8.reference\u002F1.cli",[273,277],{"title":274,"path":275,"stem":276},"orchestrator-zero","\u002Freference\u002Fcli\u002Forchestrator-zero","8.reference\u002F1.cli\u002F1.orchestrator-zero",{"title":278,"path":279,"stem":280},"orchestrator-zero-node","\u002Freference\u002Fcli\u002Forchestrator-zero-node","8.reference\u002F1.cli\u002F2.orchestrator-zero-node",{"title":282,"path":283,"stem":284,"icon":285},"oz0-plugin.yaml","\u002Freference\u002Fplugin-manifest","8.reference\u002F2.plugin-manifest","i-ph-file-code",{"title":287,"path":288,"stem":289,"icon":162},"Agent definition","\u002Freference\u002Fagent-definition","8.reference\u002F3.agent-definition",{"title":291,"path":292,"stem":293,"icon":294},"Ports","\u002Freference\u002Fports","8.reference\u002F4.ports","i-ph-network",{"title":296,"path":297,"stem":298,"icon":299},"Environment variables","\u002Freference\u002Fenvironment","8.reference\u002F5.environment","i-ph-brackets-curly",{"title":301,"path":302,"stem":303,"icon":304},"Files and directories","\u002Freference\u002Ffiles","8.reference\u002F6.files","i-ph-tree-structure",{"title":306,"icon":6,"path":307,"stem":308,"children":309,"page":6},"About","\u002Fabout","9.about",[310,315],{"title":311,"path":312,"stem":313,"icon":314},"Licensing","\u002Fabout\u002Flicensing","9.about\u002F1.licensing","i-ph-scales",{"title":316,"path":317,"stem":318,"icon":319},"About these docs","\u002Fabout\u002Fcontributing-docs","9.about\u002F2.contributing-docs","i-ph-pencil-simple",{"id":321,"title":184,"body":322,"description":1176,"extension":1177,"links":1178,"meta":1179,"navigation":1180,"path":185,"seo":1181,"stem":186,"__hash__":1182},"docs\u002F5.build-plugins\u002F8.flows.md",{"type":323,"value":324,"toc":1170},"minimark",[325,329,580,591,596,599,627,653,657,660,752,774,785,805,839,934,937,952,1038,1048,1055,1059,1088,1114,1117,1154,1162,1166],[326,327,328],"p",{},"A flow is a YAML file of steps: call a tool, run an agent, wait for a person, each under a condition if you like. Our own flow workflow runs it, so a flow can never break Temporal's determinism, and a new version of a flow ships with its plugin.",[330,331,337],"pre",{"className":332,"code":333,"filename":334,"language":335,"meta":336,"style":336},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","name: support-triage\ndescription: Routes a ticket to the right team\ninput_schema: schemas\u002Fticket.json        # optional\nsteps:\n  - id: classify\n    tool: triage.classify\n    input:\n      ticket: ${{ input.ticket }}\n      teams: [billing, technical, sales]\n  - id: route\n    when: steps.classify.confidence >= 0.8\n    agent: support-${{ steps.classify.team }}\n    input: ${{ input.ticket }}\n  - id: ask_human\n    when: steps.classify.confidence \u003C 0.8\n    approval:\n      details: \"Route ${{ input.ticket.subject }} to ${{ steps.classify.team }}?\"\n      timeout: 4h\noutput: \"${{ has(steps.route) ? steps.route : 'a person decides' }}\"\n","flows\u002Fsupport-triage.yaml","yaml","",[338,339,340,357,368,383,392,406,417,425,436,464,476,487,498,507,519,529,537,554,565],"code",{"__ignoreMap":336},[341,342,345,349,353],"span",{"class":343,"line":344},"line",1,[341,346,348],{"class":347},"swJcz","name",[341,350,352],{"class":351},"sMK4o",":",[341,354,356],{"class":355},"sfazB"," support-triage\n",[341,358,360,363,365],{"class":343,"line":359},2,[341,361,362],{"class":347},"description",[341,364,352],{"class":351},[341,366,367],{"class":355}," Routes a ticket to the right team\n",[341,369,371,374,376,379],{"class":343,"line":370},3,[341,372,373],{"class":347},"input_schema",[341,375,352],{"class":351},[341,377,378],{"class":355}," schemas\u002Fticket.json",[341,380,382],{"class":381},"sHwdD","        # optional\n",[341,384,386,389],{"class":343,"line":385},4,[341,387,388],{"class":347},"steps",[341,390,391],{"class":351},":\n",[341,393,395,398,401,403],{"class":343,"line":394},5,[341,396,397],{"class":351},"  -",[341,399,400],{"class":347}," id",[341,402,352],{"class":351},[341,404,405],{"class":355}," classify\n",[341,407,409,412,414],{"class":343,"line":408},6,[341,410,411],{"class":347},"    tool",[341,413,352],{"class":351},[341,415,416],{"class":355}," triage.classify\n",[341,418,420,423],{"class":343,"line":419},7,[341,421,422],{"class":347},"    input",[341,424,391],{"class":351},[341,426,428,431,433],{"class":343,"line":427},8,[341,429,430],{"class":347},"      ticket",[341,432,352],{"class":351},[341,434,435],{"class":355}," ${{ input.ticket }}\n",[341,437,439,442,444,447,450,453,456,458,461],{"class":343,"line":438},9,[341,440,441],{"class":347},"      teams",[341,443,352],{"class":351},[341,445,446],{"class":351}," [",[341,448,449],{"class":355},"billing",[341,451,452],{"class":351},",",[341,454,455],{"class":355}," technical",[341,457,452],{"class":351},[341,459,460],{"class":355}," sales",[341,462,463],{"class":351},"]\n",[341,465,467,469,471,473],{"class":343,"line":466},10,[341,468,397],{"class":351},[341,470,400],{"class":347},[341,472,352],{"class":351},[341,474,475],{"class":355}," route\n",[341,477,479,482,484],{"class":343,"line":478},11,[341,480,481],{"class":347},"    when",[341,483,352],{"class":351},[341,485,486],{"class":355}," steps.classify.confidence >= 0.8\n",[341,488,490,493,495],{"class":343,"line":489},12,[341,491,492],{"class":347},"    agent",[341,494,352],{"class":351},[341,496,497],{"class":355}," support-${{ steps.classify.team }}\n",[341,499,501,503,505],{"class":343,"line":500},13,[341,502,422],{"class":347},[341,504,352],{"class":351},[341,506,435],{"class":355},[341,508,510,512,514,516],{"class":343,"line":509},14,[341,511,397],{"class":351},[341,513,400],{"class":347},[341,515,352],{"class":351},[341,517,518],{"class":355}," ask_human\n",[341,520,522,524,526],{"class":343,"line":521},15,[341,523,481],{"class":347},[341,525,352],{"class":351},[341,527,528],{"class":355}," steps.classify.confidence \u003C 0.8\n",[341,530,532,535],{"class":343,"line":531},16,[341,533,534],{"class":347},"    approval",[341,536,391],{"class":351},[341,538,540,543,545,548,551],{"class":343,"line":539},17,[341,541,542],{"class":347},"      details",[341,544,352],{"class":351},[341,546,547],{"class":351}," \"",[341,549,550],{"class":355},"Route ${{ input.ticket.subject }} to ${{ steps.classify.team }}?",[341,552,553],{"class":351},"\"\n",[341,555,557,560,562],{"class":343,"line":556},18,[341,558,559],{"class":347},"      timeout",[341,561,352],{"class":351},[341,563,564],{"class":355}," 4h\n",[341,566,568,571,573,575,578],{"class":343,"line":567},19,[341,569,570],{"class":347},"output",[341,572,352],{"class":351},[341,574,547],{"class":351},[341,576,577],{"class":355},"${{ has(steps.route) ? steps.route : 'a person decides' }}",[341,579,553],{"class":351},[326,581,582,583,586,587,590],{},"List flows in the manifest with ",[338,584,585],{},"flows: [flows\u002F]",", a folder of ",[338,588,589],{},"*.yaml"," files or single files.",[592,593,595],"h2",{"id":594},"run-one","Run one",[326,597,598],{},"A flow runs as a job, by name, like an agent:",[330,600,605],{"className":601,"code":602,"filename":603,"language":604,"meta":336,"style":336},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","orchestrator-zero run support-triage '{\"ticket\": {\"subject\": \"Refund\", \"body\": \"...\"}}'\n","Terminal","bash",[338,606,607],{"__ignoreMap":336},[341,608,609,612,615,618,621,624],{"class":343,"line":344},[341,610,274],{"class":611},"sBMFI",[341,613,614],{"class":355}," run",[341,616,617],{"class":355}," support-triage",[341,619,620],{"class":351}," '",[341,622,623],{"class":355},"{\"ticket\": {\"subject\": \"Refund\", \"body\": \"...\"}}",[341,625,626],{"class":351},"'\n",[326,628,629,632,633,632,636,639,640,644,645,648,649,652],{},[338,630,631],{},"job watch",", ",[338,634,635],{},"job get",[338,637,638],{},"job cancel",", the web UI's job page, the ",[641,642,643],"a",{"href":220},"runtime API"," and cost per branch work for flow jobs as for agent jobs; ",[338,646,647],{},"orchestrator-zero catalog"," lists flows with their steps. A flow job has ",[338,650,651],{},"flow: true",".",[592,654,656],{"id":655},"start-one-from-a-webhook","Start one from a webhook",[326,658,659],{},"A flow with a webhook trigger starts when a service posts to the edge:",[330,661,663],{"className":332,"code":662,"filename":334,"language":335,"meta":336,"style":336},"name: support-triage\ntrigger:\n  webhook: { secret: ZENDESK_WEBHOOK }   # a tenant secret, which only the edge reads\nsteps:\n  - id: classify\n    tool: triage.classify\n    input: { ticket: \"${{ trigger.body.ticket }}\" }\n",[338,664,665,673,680,704,710,720,728],{"__ignoreMap":336},[341,666,667,669,671],{"class":343,"line":344},[341,668,348],{"class":347},[341,670,352],{"class":351},[341,672,356],{"class":355},[341,674,675,678],{"class":343,"line":359},[341,676,677],{"class":347},"trigger",[341,679,391],{"class":351},[341,681,682,685,687,690,693,695,698,701],{"class":343,"line":370},[341,683,684],{"class":347},"  webhook",[341,686,352],{"class":351},[341,688,689],{"class":351}," {",[341,691,692],{"class":347}," secret",[341,694,352],{"class":351},[341,696,697],{"class":355}," ZENDESK_WEBHOOK",[341,699,700],{"class":351}," }",[341,702,703],{"class":381},"   # a tenant secret, which only the edge reads\n",[341,705,706,708],{"class":343,"line":385},[341,707,388],{"class":347},[341,709,391],{"class":351},[341,711,712,714,716,718],{"class":343,"line":394},[341,713,397],{"class":351},[341,715,400],{"class":347},[341,717,352],{"class":351},[341,719,405],{"class":355},[341,721,722,724,726],{"class":343,"line":408},[341,723,411],{"class":347},[341,725,352],{"class":351},[341,727,416],{"class":355},[341,729,730,732,734,736,739,741,743,746,749],{"class":343,"line":419},[341,731,422],{"class":347},[341,733,352],{"class":351},[341,735,689],{"class":351},[341,737,738],{"class":347}," ticket",[341,740,352],{"class":351},[341,742,547],{"class":351},[341,744,745],{"class":355},"${{ trigger.body.ticket }}",[341,747,748],{"class":351},"\"",[341,750,751],{"class":351}," }\n",[330,753,755],{"className":601,"code":754,"filename":603,"language":604,"meta":336,"style":336},"orchestrator-zero secret set ZENDESK_WEBHOOK --from-file ~\u002F.secrets\u002Fzendesk-webhook\n",[338,756,757],{"__ignoreMap":336},[341,758,759,761,763,766,768,771],{"class":343,"line":344},[341,760,274],{"class":611},[341,762,692],{"class":355},[341,764,765],{"class":355}," set",[341,767,697],{"class":355},[341,769,770],{"class":355}," --from-file",[341,772,773],{"class":355}," ~\u002F.secrets\u002Fzendesk-webhook\n",[326,775,776,777,780,781,784],{},"The service posts JSON to ",[338,778,779],{},"https:\u002F\u002F\u003Cedge>:7443\u002Fv1\u002Fflows\u002F\u003Ctenant>\u002F\u003Cflow>",", here ",[338,782,783],{},"https:\u002F\u002Fedge.example.com:7443\u002Fv1\u002Fflows\u002Fdefault\u002Fsupport-triage",", and proves it knows the secret in one of two ways:",[786,787,788,795],"ul",{},[789,790,791,794],"li",{},[338,792,793],{},"Authorization: Bearer \u003Csecret>",", as Zendesk and most services can send;",[789,796,797,798,801,802,652],{},"an HMAC-SHA256 signature of the body with the secret as its key, in ",[338,799,800],{},"X-Hub-Signature-256: sha256=\u003Chex>"," (GitHub's header) or ",[338,803,804],{},"X-Oz0-Signature",[326,806,807,808,811,812,815,816,819,820,823,824,632,827,830,831,834,835,838],{},"The body becomes the flow's ",[338,809,810],{},"input"," and ",[338,813,814],{},"trigger.body","; the request's headers, without credentials and signatures, are ",[338,817,818],{},"trigger.headers",". The edge answers ",[338,821,822],{},"202"," with the job's ID. When the request carries a delivery ID (",[338,825,826],{},"Idempotency-Key",[338,828,829],{},"X-GitHub-Delivery"," or ",[338,832,833],{},"X-Request-Id","), a retry of the same delivery is the same job, and a retry after it ended gets ",[338,836,837],{},"200"," with that job's ID instead of a second run. Bodies are at most 1 MB.",[840,841,842,870,879,909,919,927],"warning",{},[326,843,844,848,849,855,856,859,860,632,863,830,866,869],{},[845,846,847],"strong",{},"A webhook's body is text from outside."," An issue title or a ticket can carry instructions, and an agent may follow them. Until harness sessions run in a sandbox and pass hooks and approvals (",[641,850,854],{"href":851,"rel":852},"https:\u002F\u002Fgithub.com\u002Fmoon-ventures-se\u002Forchestrator-zero\u002Fblob\u002Fdevelop\u002Fdocs\u002Fadr\u002F0030-sandboxes-for-triggered-jobs-and-harness-sessions.md",[853],"nofollow","ADR 0030","), keep agents with a shell or write tools, such as a ",[641,857,858],{"href":145},"harness"," agent with ",[338,861,862],{},"Bash",[338,864,865],{},"Write",[338,867,868],{},"Edit",", out of every flow a webhook starts, and out of the agents those flows delegate to. Pydantic AI agents are safer here: each of their tool calls passes your hooks and approvals.",[326,871,872,811,875,878],{},[338,873,874],{},"plugin lint",[338,876,877],{},"plugin install"," enforce this. A flow with a webhook trigger may reach, through its agent steps and their delegation, only agents that cannot run a command or change a file:",[786,880,881,884],{},[789,882,883],{},"Pydantic AI and other framework agents;",[789,885,886,887,890,891,632,894,632,897,632,900,632,903,830,906,652],{},"agents on the Claude harness whose ",[338,888,889],{},"harness.tools"," list only ",[338,892,893],{},"Read",[338,895,896],{},"Glob",[338,898,899],{},"Grep",[338,901,902],{},"LS",[338,904,905],{},"NotebookRead",[338,907,908],{},"TodoWrite",[326,910,911,912,632,914,811,916,918],{},"An agent on any other harness, or on the Claude harness with its default tools (which include ",[338,913,862],{},[338,915,865],{},[338,917,868],{},"), is refused, with the way the flow reaches it:",[330,920,925],{"className":921,"code":923,"language":924,"meta":336},[922],"language-text","flow fix-issue, which a webhook starts, can reach agent fixer (fix-issue -> fixer): it lists no harness tools, so it gets Read, Write, Edit, Glob, Grep, Bash, which include Write, Edit, Bash\n","text",[338,926,923],{"__ignoreMap":336},[326,928,929,930,933],{},"A step whose agent is an expression, such as ",[338,931,932],{},"support-${{ steps.decide.team }}",", can reach every agent its fixed parts match. The check runs across the tenant's plugins at install: a plugin is refused when it brings either the flow or the agent. A way that was installed before the check existed is reported as a warning.",[592,935,936],{"id":388},"Steps",[326,938,939,940,943,944,947,948,951],{},"Each step has an ",[338,941,942],{},"id"," (lowercase letters, digits and ",[338,945,946],{},"_",", so expressions can read it as ",[338,949,950],{},"steps.\u003Cid>",") and does one thing:",[953,954,955,973],"table",{},[956,957,958],"thead",{},[959,960,961,965,968],"tr",{},[962,963,964],"th",{},"Step",[962,966,967],{},"Does",[962,969,970,971],{},"Its output, in ",[338,972,950],{},[974,975,976,999,1014],"tbody",{},[959,977,978,987,996],{},[979,980,981,984,985],"td",{},[338,982,983],{},"tool: \u003Ctool>.\u003Cfunction>"," with ",[338,986,810],{},[979,988,989,990,811,993],{},"Calls a tool function on the flow's home node, with the tenant's ",[641,991,992],{"href":180},"hooks",[641,994,995],{"href":225},"approvals",[979,997,998],{},"The tool's structured result, or its text (parsed when it is JSON)",[959,1000,1001,1008,1011],{},[979,1002,1003,984,1006],{},[338,1004,1005],{},"agent: \u003Cname>",[338,1007,810],{},[979,1009,1010],{},"Runs an agent as a child job and waits for its answer",[979,1012,1013],{},"The agent's answer",[959,1015,1016,1027,1033],{},[979,1017,1018,984,1021,811,1024],{},[338,1019,1020],{},"approval:",[338,1022,1023],{},"details",[338,1025,1026],{},"timeout",[979,1028,1029,1030,1032],{},"Waits for a person; no answer within ",[338,1031,1026],{}," (default 24 h) is a no",[979,1034,1035],{},[338,1036,1037],{},"{approved, by, comment}",[326,1039,1040,1043,1044,1047],{},[338,1041,1042],{},"when:"," makes a step conditional; a step whose condition is false is skipped and has no output, which ",[338,1045,1046],{},"has(steps.\u003Cid>)"," tells. Steps run in order. A step that fails, or an approval that is denied, ends the flow with the step's ID in the error.",[326,1049,1050,1051,1054],{},"The flow's answer is ",[338,1052,1053],{},"output:",", or the last step's output when there is none.",[592,1056,1058],{"id":1057},"expressions","Expressions",[326,1060,1061,1062,1067,1068,1070,1071,1073,1074,1077,1078,1080,1081,811,1084,1087],{},"Expressions are ",[641,1063,1066],{"href":1064,"rel":1065},"https:\u002F\u002Fcel.dev",[853],"CEL",". They see ",[338,1069,810],{}," (the flow's input), ",[338,1072,388],{}," (the outputs of the steps so far), ",[338,1075,1076],{},"job"," (the job's ID) and ",[338,1079,677],{}," (for a webhook, its ",[338,1082,1083],{},"headers",[338,1085,1086],{},"body","; null otherwise).",[786,1089,1090,1095],{},[789,1091,1092,1094],{},[338,1093,1042],{}," is one expression, true or false.",[789,1096,1097,1098,1101,1102,1105,1106,1109,1110,1113],{},"Everywhere else, a value is literal unless it contains ",[338,1099,1100],{},"${{ ... }}",". A string that is exactly one ",[338,1103,1104],{},"${{ expression }}"," becomes the expression's value, with its type: ",[338,1107,1108],{},"input: ${{ input.ticket }}"," passes the whole ticket. Other strings get the values filled in: ",[338,1111,1112],{},"agent: support-${{ steps.classify.team }}",". A map or a list filled into a string is written as JSON, with the keys of maps sorted.",[326,1115,1116],{},"Mind two things:",[786,1118,1119,1136],{},[789,1120,1121,1124,1125,1128,1129,1132,1133,1135],{},[845,1122,1123],{},"Quote what YAML would misread."," An expression with ",[338,1126,1127],{},": "," or a leading ",[338,1130,1131],{},"{"," needs quotes, like the ",[338,1134,1053],{}," above.",[789,1137,1138,1141,1142,1145,1146,1149,1150,1153],{},[845,1139,1140],{},"CEL is strict about types."," ",[338,1143,1144],{},"2.0 * 3"," is an error; write ",[338,1147,1148],{},"2.0 * 3.0",". Comparing an int with a double (",[338,1151,1152],{},"1 >= 0.8",") is fine.",[326,1155,1156,1158,1159,1161],{},[338,1157,874],{}," checks every expression, and that each ",[338,1160,950],{}," names an earlier step, so a mistake fails the install, not the first run.",[1163,1164,1165],"note",{},"Steps that run in parallel, retries and error branches come later.",[1167,1168,1169],"style",{},"html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":336,"searchDepth":359,"depth":359,"links":1171},[1172,1173,1174,1175],{"id":594,"depth":359,"text":595},{"id":655,"depth":359,"text":656},{"id":388,"depth":359,"text":936},{"id":1057,"depth":359,"text":1058},"Declarative steps that chain tools, agents, conditions and approvals.","md",null,{},{"icon":187},{"title":184,"description":1176},"b7XjO7GehTyFefMOyiHLBxkezCTtCh01ebl42_0fUvY",[1184,1186],{"title":179,"path":180,"stem":181,"description":1185,"icon":182,"children":-1},"Your own checks before and after tool calls and at the start and end of a job.",{"title":189,"path":190,"stem":191,"description":1187,"icon":192,"children":-1},"Test cases for your agents and flows, run with recorded model answers, that stop a worse version.",1791135411781]