[{"data":1,"prerenderedAt":886},["ShallowReactive",2],{"navigation_docs":3,"-plugins-install":320,"-plugins-install-surround":881},[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":120,"body":322,"description":874,"extension":875,"links":876,"meta":877,"navigation":878,"path":121,"seo":879,"stem":122,"__hash__":880},"docs\u002F4.plugins\u002F2.install.md",{"type":323,"value":324,"toc":864},"minimark",[325,329,358,373,417,431,438,442,451,473,476,480,491,532,548,563,567,571,578,586,597,601,615,621,625,642,657,662,666,674,723,729,732,753,764,779,785,796,818,837,841,857,860],[326,327,26],"h2",{"id":328},"install",[330,331,337],"pre",{"className":332,"code":333,"filename":334,"language":335,"meta":336,"style":336},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","orchestrator-zero plugin install https:\u002F\u002Fgithub.com\u002Facme\u002Foz-github-tools\n","Terminal","bash","",[338,339,340],"code",{"__ignoreMap":336},[341,342,345,348,352,355],"span",{"class":343,"line":344},"line",1,[341,346,274],{"class":347},"sBMFI",[341,349,351],{"class":350},"sfazB"," plugin",[341,353,354],{"class":350}," install",[341,356,357],{"class":350}," https:\u002F\u002Fgithub.com\u002Facme\u002Foz-github-tools\n",[359,360,361,362,365,366,369,370,372],"p",{},"Without ",[338,363,364],{},"--ref",", the edge takes the highest ",[338,367,368],{},"vX.Y.Z"," tag, compared as numbers, or the default branch when there is no release tag. Pin a branch, a tag or a full commit SHA with ",[338,371,364],{},":",[330,374,376],{"className":332,"code":375,"filename":334,"language":335,"meta":336,"style":336},"orchestrator-zero plugin install https:\u002F\u002Fgithub.com\u002Facme\u002Foz-github-tools --ref v1.4.0\norchestrator-zero plugin install https:\u002F\u002Fgithub.com\u002Facme\u002Foz-github-tools --ref main --select team=platform\n",[338,377,378,395],{"__ignoreMap":336},[341,379,380,382,384,386,389,392],{"class":343,"line":344},[341,381,274],{"class":347},[341,383,351],{"class":350},[341,385,354],{"class":350},[341,387,388],{"class":350}," https:\u002F\u002Fgithub.com\u002Facme\u002Foz-github-tools",[341,390,391],{"class":350}," --ref",[341,393,394],{"class":350}," v1.4.0\n",[341,396,398,400,402,404,406,408,411,414],{"class":343,"line":397},2,[341,399,274],{"class":347},[341,401,351],{"class":350},[341,403,354],{"class":350},[341,405,388],{"class":350},[341,407,391],{"class":350},[341,409,410],{"class":350}," main",[341,412,413],{"class":350}," --select",[341,415,416],{"class":350}," team=platform\n",[359,418,419,422,423,426,427,430],{},[338,420,421],{},"--select key=value"," installs it only on nodes with that label; repeat it to require several. ",[338,424,425],{},"--tenant"," picks the tenant (default ",[338,428,429],{},"default","). Installing a plugin that is already installed updates it.",[359,432,433,434,437],{},"In dev mode the edge also accepts ",[338,435,436],{},"file:\u002F\u002F"," URLs and local folders.",[326,439,441],{"id":440},"a-plugin-in-a-folder","A plugin in a folder",[359,443,444,445,447,448,372],{},"A repository can hold several plugins, each in its own folder with its own ",[338,446,282],{},". Name the folder with ",[338,449,450],{},"--path",[330,452,454],{"className":332,"code":453,"filename":334,"language":335,"meta":336,"style":336},"orchestrator-zero plugin install https:\u002F\u002Fgithub.com\u002Facme\u002Fagents --path plugins\u002Fgithub-tools\n",[338,455,456],{"__ignoreMap":336},[341,457,458,460,462,464,467,470],{"class":343,"line":344},[341,459,274],{"class":347},[341,461,351],{"class":350},[341,463,354],{"class":350},[341,465,466],{"class":350}," https:\u002F\u002Fgithub.com\u002Facme\u002Fagents",[341,468,469],{"class":350}," --path",[341,471,472],{"class":350}," plugins\u002Fgithub-tools\n",[359,474,475],{},"The ref still applies to the whole repository: the edge locks the commit, then packs only that folder, so the plugin sees the folder as its root and nothing else from the repository reaches the nodes. The path cannot leave the repository, and a folder that is a symlink does not count as one.",[326,477,479],{"id":478},"a-private-repository","A private repository",[359,481,482,483,487,488,372],{},"The edge fetches a private repository over HTTPS with a token you keep as a ",[484,485,486],"a",{"href":96},"tenant secret",". Store the token, then name the secret with ",[338,489,490],{},"--secret",[330,492,494],{"className":332,"code":493,"filename":334,"language":335,"meta":336,"style":336},"orchestrator-zero secret set GITHUB_TOKEN --from-file ~\u002F.secrets\u002Fgithub-token\norchestrator-zero plugin install https:\u002F\u002Fgithub.com\u002Facme\u002Fprivate-tools --secret GITHUB_TOKEN\n",[338,495,496,515],{"__ignoreMap":336},[341,497,498,500,503,506,509,512],{"class":343,"line":344},[341,499,274],{"class":347},[341,501,502],{"class":350}," secret",[341,504,505],{"class":350}," set",[341,507,508],{"class":350}," GITHUB_TOKEN",[341,510,511],{"class":350}," --from-file",[341,513,514],{"class":350}," ~\u002F.secrets\u002Fgithub-token\n",[341,516,517,519,521,523,526,529],{"class":343,"line":397},[341,518,274],{"class":347},[341,520,351],{"class":350},[341,522,354],{"class":350},[341,524,525],{"class":350}," https:\u002F\u002Fgithub.com\u002Facme\u002Fprivate-tools",[341,527,528],{"class":350}," --secret",[341,530,531],{"class":350}," GITHUB_TOKEN\n",[359,533,534,535,538,539,542,543,547],{},"The secret holds the token alone, or ",[338,536,537],{},"user:token"," for Git servers that need a particular user name. A token alone goes as the user ",[338,540,541],{},"x-access-token",", which GitHub accepts for personal access tokens and app tokens alike. Give it read access to that repository only: on GitHub, a fine-grained token with ",[544,545,546],"em",{},"Contents: read",".",[359,549,550,551,554,555,558,559,562],{},"The edge unseals the token for the fetch and hands it to ",[338,552,553],{},"git"," in its environment, never on a command line, and only for the repository's host, over HTTPS. The plugin remembers the secret's name, never its value, so ",[338,556,557],{},"plugin update"," fetches the same way; after you rotate the token with ",[338,560,561],{},"secret set",", updates use the new one.",[564,565,566],"note",{},"SSH URLs and deploy keys are not supported yet; use an HTTPS URL with a token.",[326,568,570],{"id":569},"a-quality-gate-for-plugins-with-evals","A quality gate for plugins with evals",[359,572,573,574,577],{},"A version of a plugin that has ",[484,575,576],{"href":190},"evals"," runs them on one test node before the fleet gets it, and is stopped when it does worse than its thresholds or the version it replaces. Until then the fleet keeps the installed version:",[330,579,584],{"className":580,"code":582,"language":583,"meta":336},[581],"language-text","Testing team 0.2.0 (commit ff4d7eae2c6d…) in tenant default before the fleet gets it: its evals run on a test node.\nUntil it passes, the fleet keeps team 0.1.0.\n","text",[338,585,582],{"__ignoreMap":336},[359,587,588,591,592,596],{},[338,589,590],{},"--no-gate"," installs it at once. See ",[484,593,595],{"href":594},"\u002Fbuild-plugins\u002Fevals#quality-gates","Quality gates"," for how the verdict works.",[326,598,600],{"id":599},"see-how-it-is-going","See how it is going",[330,602,604],{"className":332,"code":603,"filename":334,"language":335,"meta":336,"style":336},"orchestrator-zero plugin list\n",[338,605,606],{"__ignoreMap":336},[341,607,608,610,612],{"class":343,"line":344},[341,609,274],{"class":347},[341,611,351],{"class":350},[341,613,614],{"class":350}," list\n",[359,616,617,620],{},[338,618,619],{},"plugin list"," shows every plugin, its locked commit (and its folder, for one in a folder), and each node's state with it: whether the node has built and started it, the functions it found, or the error it hit. For a plugin with evals it also shows the gate of its latest version: waiting, testing, passed or stopped, and why.",[326,622,624],{"id":623},"update","Update",[330,626,628],{"className":332,"code":627,"filename":334,"language":335,"meta":336,"style":336},"orchestrator-zero plugin update github-tools\n",[338,629,630],{"__ignoreMap":336},[341,631,632,634,636,639],{"class":343,"line":344},[341,633,274],{"class":347},[341,635,351],{"class":350},[341,637,638],{"class":350}," update",[341,640,641],{"class":350}," github-tools\n",[359,643,644,646,647,650,651,654,655,547],{},[338,645,623],{}," resolves the plugin's ref again, in the same folder and with the same secret, and rolls out what it points to now, through its quality gate when it has evals. With ",[338,648,649],{},"--ref main",", that is the latest commit on ",[338,652,653],{},"main","; with a tag, the same commit unless the tag moved. To move to a new release, install it again with the new ",[338,656,364],{},[359,658,659,660,547],{},"A node restarts its runtime once the new version is ready. If the new version fails to build or start, the node keeps the previous one running and reports the failure in ",[338,661,619],{},[326,663,665],{"id":664},"new-versions-roll-out-to-canaries-first","New versions roll out to canaries first",[359,667,668,669,673],{},"When a plugin runs on two or more online nodes, its new version does not reach them all at once. It goes to a canary node first, then to the rest in steps, and each step must pass the same health and quality gates as a ",[484,670,672],{"href":671},"\u002Ffleet\u002Fupgrades#roll-a-runtime-out-in-steps","runtime rollout",". A version with evals passes its quality gate first, then rolls out.",[330,675,677],{"className":332,"code":676,"filename":334,"language":335,"meta":336,"style":336},"orchestrator-zero plugin update github-tools\norchestrator-zero plugin install https:\u002F\u002Fgithub.com\u002Facme\u002Foz-github-tools --ref v1.5.0 --canary 2 --batch 5 --soak 10m\n",[338,678,679,689],{"__ignoreMap":336},[341,680,681,683,685,687],{"class":343,"line":344},[341,682,274],{"class":347},[341,684,351],{"class":350},[341,686,638],{"class":350},[341,688,641],{"class":350},[341,690,691,693,695,697,699,701,704,707,711,714,717,720],{"class":343,"line":397},[341,692,274],{"class":347},[341,694,351],{"class":350},[341,696,354],{"class":350},[341,698,388],{"class":350},[341,700,391],{"class":350},[341,702,703],{"class":350}," v1.5.0",[341,705,706],{"class":350}," --canary",[341,708,710],{"class":709},"sbssI"," 2",[341,712,713],{"class":350}," --batch",[341,715,716],{"class":709}," 5",[341,718,719],{"class":350}," --soak",[341,721,722],{"class":350}," 10m\n",[330,724,727],{"className":725,"code":726,"language":583,"meta":336},[581],"Rolling team 0.2.0 (4f1c2d9) out in tenant default, canaries first: rollout rollout-6b1e0c2a.\nUntil it is done, the other nodes keep team 0.1.0.\nFollow with: orchestrator-zero rollout show rollout-6b1e0c2a (--all-at-once gives a version to every node at once)\n",[338,728,726],{"__ignoreMap":336},[359,730,731],{},"Each step:",[733,734,735,743,746],"ol",{},[736,737,738,739,742],"li",{},"gives the new version to its nodes, which run it instead of the installed one, and waits until they report it ready, for at most ",[338,740,741],{},"--start-timeout"," (5 minutes);",[736,744,745],{},"sends those nodes their share of the plugin's new jobs: with one node of three on the new version, a third of them (the nodes of a step that is starting take no new jobs until they run the new version);",[736,747,748,749,752],{},"watches them for ",[338,750,751],{},"--soak"," (1 minute), and then judges the step.",[359,754,755,756,759,760,763],{},"The new version answers on task queues of its own, ",[338,757,758],{},"roll.\u003Ccommit>.agent.\u003Cname>"," and ",[338,761,762],{},"roll.\u003Ccommit>.flow.\u003Cname>",", so each job runs on one version from its start to its end, and the quality gate can tell them apart. It compares the jobs that failed on those queues with the jobs that failed on the plugin's usual queues over the same time. A child job from the same plugin stays on its parent's version. A node takes the new version's jobs once it runs the new version, and in the last step, when no node is left on the old version, the rollout's nodes also finish the jobs left on the usual queues.",[359,765,766,767,770,771,774,775,778],{},"When the last step passes, the new version becomes the installed version on every node. When a step fails, or you abort with ",[338,768,769],{},"rollout abort",", the candidate is dropped and the canaries go back to the installed version. Either way, the nodes on the installed version finish the jobs that are still on the rollout's queues; ",[338,772,773],{},"rollout show"," says ",[338,776,777],{},"draining"," until none is left. Here a version that changed its agent's input contract failed its canary's jobs:",[330,780,783],{"className":781,"code":782,"language":583,"meta":336},[581],"Rollout rollout-838939ab: tenant default, plugin team from 0.2.0 (25e707a) to 0.3.0 (dc6f7d2), rolled-back, draining\n  canary  failed   node-030651b413c5: step 1: 54 of 54 jobs failed on 0.3.0 (100%), against 0% on 0.2.0\n  step 2  pending  node-d81206129a00\n  step 3  pending  node-e4c46863afd8\nReason: step 1: 54 of 54 jobs failed on 0.3.0 (100%), against 0% on 0.2.0\n",[338,784,782],{"__ignoreMap":336},[359,786,787,788,791,792,795],{},"In ",[338,789,790],{},"make e2e-rollout",", which runs jobs in four loops meanwhile, the rollout ended 28 seconds after ",[338,793,794],{},"plugin install",", and only the jobs that reached the canary failed: 60 of 233.",[797,798,799,802,805,812,815],"ul",{},[736,800,801],{},"A tenant runs one rollout at a time, of a runtime or of a plugin. A plugin rollout asked for while another one runs waits for its turn, and its steps are planned when it starts.",[736,803,804],{},"While a plugin has a rollout waiting or running, a new version of it is refused; wait for the rollout to end, or abort it.",[736,806,807,808,811],{},"A first install, a plugin on one node, and ",[338,809,810],{},"--all-at-once"," go to every node at once.",[736,813,814],{},"An agent the new version adds can be started once the rollout is done. Jobs check their input against the installed version's schema.",[736,816,817],{},"A job whose plugin changed under it in a way its history cannot follow, such as a flow that lost a step, fails with the reason instead of waiting forever.",[359,819,820,821,825,826,829,830,836],{},"The Plugins page shows each rollout's steps next to the plugin, with ",[822,823,824],"strong",{},"Roll back",", or ",[822,827,828],{},"Drop"," for one that waits. See ",[484,831,835],{"href":832,"rel":833},"https:\u002F\u002Fgithub.com\u002Fmoon-ventures-se\u002Forchestrator-zero\u002Fblob\u002Fdevelop\u002Fdocs\u002Fadr\u002F0052-plugin-rollouts.md",[834],"nofollow","ADR 0052"," for the design.",[326,838,840],{"id":839},"remove","Remove",[330,842,844],{"className":332,"code":843,"filename":334,"language":335,"meta":336,"style":336},"orchestrator-zero plugin remove github-tools\n",[338,845,846],{"__ignoreMap":336},[341,847,848,850,852,855],{"class":343,"line":344},[341,849,274],{"class":347},[341,851,351],{"class":350},[341,853,854],{"class":350}," remove",[341,856,641],{"class":350},[359,858,859],{},"Nodes stop the plugin's processes and delete it. A rollout of it that waits or runs ends.",[861,862,863],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":336,"searchDepth":397,"depth":397,"links":865},[866,867,868,869,870,871,872,873],{"id":328,"depth":397,"text":26},{"id":440,"depth":397,"text":441},{"id":478,"depth":397,"text":479},{"id":569,"depth":397,"text":570},{"id":599,"depth":397,"text":600},{"id":623,"depth":397,"text":624},{"id":664,"depth":397,"text":665},{"id":839,"depth":397,"text":840},"Install a plugin from Git, choose the nodes it runs on, update it and remove it.","md",null,{},{"icon":123},{"title":120,"description":874},"1MLb8zIvpZC0PXf3YuQmvCcfojTpL_xEiGLyOLZvonk",[882,884],{"title":115,"path":116,"stem":117,"description":883,"icon":118,"children":-1},"Everything specific to your company ships as a plugin, a Git repository with one manifest.",{"title":125,"path":126,"stem":127,"description":885,"icon":123,"children":-1},"Give agents a tool from PyPI, npm or a remote MCP server without writing code.",1791135410058]