[{"data":1,"prerenderedAt":3440},["ShallowReactive",2],{"navigation_docs":3,"docs-page:\u002Fbuild\u002Fparts\u002Froutines":1849,"docs-surround:\u002Fbuild\u002Fparts\u002Froutines":3435},[4,72,214,304,947,1040,1230,1504,1590,1701,1830],{"title":5,"path":6,"stem":7,"children":8,"icon":71},"Get started","\u002Fgetting-started","01.getting-started\u002F00.index",[9,10,15,20,25,36],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","01.getting-started\u002F01.introduction","i-ph-house",{"title":16,"path":17,"stem":18,"icon":19},"Quickstart","\u002Fgetting-started\u002Fquickstart","01.getting-started\u002F02.quickstart","i-ph-rocket-launch",{"title":21,"path":22,"stem":23,"icon":24},"Concepts","\u002Fgetting-started\u002Fconcepts","01.getting-started\u002F03.concepts","i-ph-book-open",{"title":26,"path":27,"stem":28,"children":29,"icon":31},"Install","\u002Fgetting-started\u002Finstall","01.getting-started\u002F04.install\u002F00.index",[30,32],{"title":26,"path":27,"stem":28,"icon":31},"i-ph-download-simple",{"title":33,"path":34,"stem":35},"Prepare the Linux sandbox","\u002Fgetting-started\u002Finstall\u002Flinux-sandbox","01.getting-started\u002F04.install\u002F01.linux-sandbox",{"title":37,"path":38,"stem":39,"children":40,"icon":42},"Web UI","\u002Fgetting-started\u002Fweb-ui","01.getting-started\u002F05.web-ui\u002F00.index",[41,43,47,51,55,59,63,67],{"title":37,"path":38,"stem":39,"icon":42},"i-ph-monitor",{"title":44,"path":45,"stem":46},"Choose a tenant","\u002Fgetting-started\u002Fweb-ui\u002Ftenants","01.getting-started\u002F05.web-ui\u002F01.tenants",{"title":48,"path":49,"stem":50},"Find a page","\u002Fgetting-started\u002Fweb-ui\u002Fnavigation","01.getting-started\u002F05.web-ui\u002F02.navigation",{"title":52,"path":53,"stem":54},"Use the chat drawer","\u002Fgetting-started\u002Fweb-ui\u002Fchats","01.getting-started\u002F05.web-ui\u002F03.chats",{"title":56,"path":57,"stem":58},"Create and edit records","\u002Fgetting-started\u002Fweb-ui\u002Fforms","01.getting-started\u002F05.web-ui\u002F04.forms",{"title":60,"path":61,"stem":62},"Keyboard and accessibility","\u002Fgetting-started\u002Fweb-ui\u002Faccessibility","01.getting-started\u002F05.web-ui\u002F05.accessibility",{"title":64,"path":65,"stem":66},"Accounts and permissions","\u002Fgetting-started\u002Fweb-ui\u002Faccounts","01.getting-started\u002F05.web-ui\u002F06.accounts",{"title":68,"path":69,"stem":70},"Console page directory","\u002Fgetting-started\u002Fweb-ui\u002Fpage-directory","01.getting-started\u002F05.web-ui\u002F07.page-directory",false,{"title":21,"path":73,"stem":74,"children":75,"icon":71},"\u002Fconcepts","02.concepts\u002F00.index",[76,77,82,87,92,123,128,143,166,185,204,209],{"title":21,"path":73,"stem":74},{"title":78,"path":79,"stem":80,"icon":81},"Architecture","\u002Fconcepts\u002Farchitecture","02.concepts\u002F01.architecture","i-ph-planet",{"title":83,"path":84,"stem":85,"icon":86},"Jobs and durability","\u002Fconcepts\u002Fjobs","02.concepts\u002F02.jobs","i-ph-infinity",{"title":88,"path":89,"stem":90,"icon":91},"Routing","\u002Fconcepts\u002Frouting","02.concepts\u002F03.routing","i-ph-path",{"title":93,"path":94,"stem":95,"children":96,"icon":98},"Security model","\u002Fconcepts\u002Fsecurity","02.concepts\u002F04.security\u002F00.index",[97,99,103,107,111,115,119],{"title":93,"path":94,"stem":95,"icon":98},"i-ph-shield-check",{"title":100,"path":101,"stem":102},"Node identity and tenant secrets","\u002Fconcepts\u002Fsecurity\u002Fidentity-and-secrets","02.concepts\u002F04.security\u002F01.identity-and-secrets",{"title":104,"path":105,"stem":106},"Plugin processes and operator exemptions","\u002Fconcepts\u002Fsecurity\u002Fplugins","02.concepts\u002F04.security\u002F02.plugins",{"title":108,"path":109,"stem":110},"Sandbox tiers and routing","\u002Fconcepts\u002Fsecurity\u002Fsandbox-tiers","02.concepts\u002F04.security\u002F03.sandbox-tiers",{"title":112,"path":113,"stem":114},"Sandbox egress rules","\u002Fconcepts\u002Fsecurity\u002Fegress","02.concepts\u002F04.security\u002F04.egress",{"title":116,"path":117,"stem":118},"Protected files and sandbox limits","\u002Fconcepts\u002Fsecurity\u002Fprotected-files","02.concepts\u002F04.security\u002F05.protected-files",{"title":120,"path":121,"stem":122},"Security assurance","\u002Fconcepts\u002Fsecurity\u002Fassurance","02.concepts\u002F04.security\u002F06.assurance",{"title":124,"path":125,"stem":126,"icon":127},"Temporal","\u002Fconcepts\u002Ftemporal","02.concepts\u002F05.temporal","i-ph-clock",{"title":129,"path":130,"stem":131,"children":132,"icon":134},"Limits and scaling","\u002Fconcepts\u002Flimits-and-scaling","02.concepts\u002F06.limits-and-scaling\u002F00.index",[133,135,139],{"title":129,"path":130,"stem":131,"icon":134},"i-ph-gauge",{"title":136,"path":137,"stem":138},"Tenant and queue limits","\u002Fconcepts\u002Flimits-and-scaling\u002Flimits","02.concepts\u002F06.limits-and-scaling\u002F01.limits",{"title":140,"path":141,"stem":142},"Capacity measurements","\u002Fconcepts\u002Flimits-and-scaling\u002Fmeasurements","02.concepts\u002F06.limits-and-scaling\u002F02.measurements",{"title":144,"path":145,"stem":146,"children":147,"icon":149},"Threat model","\u002Fconcepts\u002Fthreat-model","02.concepts\u002F07.threat-model\u002F00.index",[148,150,154,158,162],{"title":144,"path":145,"stem":146,"icon":149},"i-ph-crosshair",{"title":151,"path":152,"stem":153},"Trust boundaries and compromise","\u002Fconcepts\u002Fthreat-model\u002Ftrust-boundaries","02.concepts\u002F07.threat-model\u002F01.trust-boundaries",{"title":155,"path":156,"stem":157},"Harness and tool boundaries","\u002Fconcepts\u002Fthreat-model\u002Fharness-tools","02.concepts\u002F07.threat-model\u002F02.harness-tools",{"title":159,"path":160,"stem":161},"Known security gaps","\u002Fconcepts\u002Fthreat-model\u002Fknown-gaps","02.concepts\u002F07.threat-model\u002F03.known-gaps",{"title":163,"path":164,"stem":165},"Origins, sequences and tool results","\u002Fconcepts\u002Fthreat-model\u002Forigins-and-results","02.concepts\u002F07.threat-model\u002F04.origins-and-results",{"title":167,"path":168,"stem":169,"children":170,"icon":172},"Outbound connections","\u002Fconcepts\u002Foutbound-connections","02.concepts\u002F08.outbound-connections\u002F00.index",[171,173,177,181],{"title":167,"path":168,"stem":169,"icon":172},"i-ph-arrow-square-out",{"title":174,"path":175,"stem":176},"Server outbound connections","\u002Fconcepts\u002Foutbound-connections\u002Fserver","02.concepts\u002F08.outbound-connections\u002F01.server",{"title":178,"path":179,"stem":180},"Node and plugin outbound connections","\u002Fconcepts\u002Foutbound-connections\u002Fnodes-and-plugins","02.concepts\u002F08.outbound-connections\u002F02.nodes-and-plugins",{"title":182,"path":183,"stem":184},"Addresses a model provider fetches","\u002Fconcepts\u002Foutbound-connections\u002Fprovider-fetches","02.concepts\u002F08.outbound-connections\u002F03.provider-fetches",{"title":186,"path":187,"stem":188,"children":189,"icon":191},"Run receipts","\u002Fconcepts\u002Frun-receipts","02.concepts\u002F09.run-receipts\u002F00.index",[190,192,196,200],{"title":186,"path":187,"stem":188,"icon":191},"i-ph-receipt",{"title":193,"path":194,"stem":195},"Authority envelopes and delegation","\u002Fconcepts\u002Frun-receipts\u002Fauthority","02.concepts\u002F09.run-receipts\u002F01.authority",{"title":197,"path":198,"stem":199},"Call bindings and budget charges","\u002Fconcepts\u002Frun-receipts\u002Fcalls-and-charges","02.concepts\u002F09.run-receipts\u002F02.calls-and-charges",{"title":201,"path":202,"stem":203},"Verify run receipts offline","\u002Fconcepts\u002Frun-receipts\u002Fverify","02.concepts\u002F09.run-receipts\u002F03.verify",{"title":205,"path":206,"stem":207,"icon":208},"Delegation and identity","\u002Fconcepts\u002Fdelegation-and-identity","02.concepts\u002F10.delegation-and-identity","i-ph-identification-badge",{"title":210,"path":211,"stem":212,"icon":213},"How a tool call is decided","\u002Fconcepts\u002Fhow-a-tool-call-is-decided","02.concepts\u002F11.how-a-tool-call-is-decided","i-ph-list-checks",{"title":215,"path":216,"stem":217,"children":218,"icon":71},"Run","\u002Fagents","03.agents\u002F00.index",[219,221,226,231,236,240,245,250,268,299],{"title":220,"path":216,"stem":217},"Run agents",{"title":222,"path":223,"stem":224,"icon":225},"Run jobs","\u002Fagents\u002Frun-jobs","03.agents\u002F01.run-jobs","i-ph-play",{"title":227,"path":228,"stem":229,"icon":230},"Job history","\u002Fagents\u002Fhistory","03.agents\u002F02.history","i-ph-clock-counter-clockwise",{"title":232,"path":233,"stem":234,"icon":235},"Long jobs","\u002Fagents\u002Flong-jobs","03.agents\u002F03.long-jobs","i-ph-hourglass-medium",{"title":237,"path":238,"stem":239,"icon":235},"Waiting for events","\u002Fagents\u002Fwaiting-for-events","03.agents\u002F04.waiting-for-events",{"title":241,"path":242,"stem":243,"icon":244},"Delegation","\u002Fagents\u002Fdelegation","03.agents\u002F05.delegation","i-ph-git-fork",{"title":246,"path":247,"stem":248,"icon":249},"Colleagues and the board","\u002Fagents\u002Fcolleagues","03.agents\u002F06.colleagues","i-ph-chats-circle",{"title":251,"path":252,"stem":253,"children":254,"icon":249},"Conversations","\u002Fagents\u002Fconversations","03.agents\u002F07.conversations\u002F00.index",[255,256,260,264],{"title":251,"path":252,"stem":253,"icon":249},{"title":257,"path":258,"stem":259},"Conversation access and history","\u002Fagents\u002Fconversations\u002Faccess-and-history","03.agents\u002F07.conversations\u002F02.access-and-history",{"title":261,"path":262,"stem":263},"Use conversations from an app","\u002Fagents\u002Fconversations\u002Fapps","03.agents\u002F07.conversations\u002F03.apps",{"title":265,"path":266,"stem":267},"Hand off a conversation and use Ask","\u002Fagents\u002Fconversations\u002Fhandoffs-and-ask","03.agents\u002F07.conversations\u002F04.handoffs-and-ask",{"title":269,"path":270,"stem":271,"children":272,"icon":274},"Decide an approval","\u002Fagents\u002Fapprovals","03.agents\u002F08.approvals\u002F00.index",[273,275,279,283,287,291,295],{"title":269,"path":270,"stem":271,"icon":274},"i-ph-hand-palm",{"title":276,"path":277,"stem":278},"Configure approval ownership and deadlines","\u002Fagents\u002Fapprovals\u002Fconfigure","03.agents\u002F08.approvals\u002F02.configure",{"title":280,"path":281,"stem":282},"How approval decisions bind a call","\u002Fagents\u002Fapprovals\u002Fsecurity","03.agents\u002F08.approvals\u002F03.security",{"title":284,"path":285,"stem":286},"Edit an approval or allow repeated calls","\u002Fagents\u002Fapprovals\u002Fedits-and-repeat-calls","03.agents\u002F08.approvals\u002F04.edits-and-repeat-calls",{"title":288,"path":289,"stem":290},"Resolve loop, budget and recovery waits","\u002Fagents\u002Fapprovals\u002Frecovery","03.agents\u002F08.approvals\u002F05.recovery",{"title":292,"path":293,"stem":294},"Review approval statistics and test cards","\u002Fagents\u002Fapprovals\u002Fstatistics","03.agents\u002F08.approvals\u002F06.statistics",{"title":296,"path":297,"stem":298},"Decide approvals from an app","\u002Fagents\u002Fapprovals\u002Fapps","03.agents\u002F08.approvals\u002F07.apps",{"title":300,"path":301,"stem":302,"icon":303},"Asking people","\u002Fagents\u002Fasking-people","03.agents\u002F09.asking-people","i-ph-chat-circle-dots",{"title":305,"path":306,"stem":307,"children":308,"icon":71},"Build","\u002Fbuild","04.build\u002F00.index",[309,310,655,844],{"title":305,"path":306,"stem":307},{"title":311,"path":312,"stem":313,"children":314,"icon":71},"Plugins","\u002Fbuild\u002Fplugins","04.build\u002F01.plugins\u002F00.index",[315,316,321,352,357,362,367,378,397,412,417,422,427,442,447,452,457,472,476,481,492,497,502,640],{"title":311,"path":312,"stem":313},{"title":317,"path":318,"stem":319,"icon":320},"What a plugin is","\u002Fbuild\u002Fplugins\u002Foverview","04.build\u002F01.plugins\u002F01.overview","i-ph-puzzle-piece",{"title":322,"path":323,"stem":324,"children":325,"icon":327},"Install a plugin","\u002Fbuild\u002Fplugins\u002Finstall","04.build\u002F01.plugins\u002F02.install\u002F00.index",[326,328,332,336,340,344,348],{"title":322,"path":323,"stem":324,"icon":327},"i-ph-package",{"title":329,"path":330,"stem":331,"icon":327},"Review an install","\u002Fbuild\u002Fplugins\u002Finstall\u002Freview","04.build\u002F01.plugins\u002F02.install\u002F01.review",{"title":333,"path":334,"stem":335,"icon":327},"Install from a source","\u002Fbuild\u002Fplugins\u002Finstall\u002Fsources","04.build\u002F01.plugins\u002F02.install\u002F02.sources",{"title":337,"path":338,"stem":339,"icon":327},"Update a plugin","\u002Fbuild\u002Fplugins\u002Finstall\u002Fupdate","04.build\u002F01.plugins\u002F02.install\u002F03.update",{"title":341,"path":342,"stem":343,"icon":327},"Roll out a plugin","\u002Fbuild\u002Fplugins\u002Finstall\u002Frollouts","04.build\u002F01.plugins\u002F02.install\u002F04.rollouts",{"title":345,"path":346,"stem":347,"icon":327},"Grant access between plugins","\u002Fbuild\u002Fplugins\u002Finstall\u002Fgrants","04.build\u002F01.plugins\u002F02.install\u002F05.grants",{"title":349,"path":350,"stem":351,"icon":327},"Retire or remove a plugin","\u002Fbuild\u002Fplugins\u002Finstall\u002Fretire-and-remove","04.build\u002F01.plugins\u002F02.install\u002F06.retire-and-remove",{"title":353,"path":354,"stem":355,"icon":356},"Configure an installed plugin","\u002Fbuild\u002Fplugins\u002Fconfigure","04.build\u002F01.plugins\u002F03.configure","i-ph-sliders-horizontal",{"title":358,"path":359,"stem":360,"icon":361},"Sets","\u002Fbuild\u002Fplugins\u002Fsets","04.build\u002F01.plugins\u002F04.sets","i-ph-stack",{"title":363,"path":364,"stem":365,"icon":366},"Your first plugin","\u002Fbuild\u002Fplugins\u002Ffirst-plugin","04.build\u002F01.plugins\u002F05.first-plugin","i-ph-hammer",{"title":368,"path":369,"stem":370,"children":371,"icon":373},"Structure a plugin","\u002Fbuild\u002Fplugins\u002Fstructure","04.build\u002F01.plugins\u002F06.structure\u002F00.index",[372,374],{"title":368,"path":369,"stem":370,"icon":373},"i-ph-tree-structure",{"title":375,"path":376,"stem":377,"icon":373},"Plugin structure rules","\u002Fbuild\u002Fplugins\u002Fstructure\u002Flint-rules","04.build\u002F01.plugins\u002F06.structure\u002F01.lint-rules",{"title":379,"path":380,"stem":381,"children":382,"icon":384},"Develop a plugin","\u002Fbuild\u002Fplugins\u002Fdevelop-and-test","04.build\u002F01.plugins\u002F07.develop-and-test\u002F00.index",[383,385,389,393],{"title":379,"path":380,"stem":381,"icon":384},"i-ph-flask",{"title":386,"path":387,"stem":388,"icon":384},"Check a plugin candidate","\u002Fbuild\u002Fplugins\u002Fdevelop-and-test\u002Fcandidate-checks","04.build\u002F01.plugins\u002F07.develop-and-test\u002F01.candidate-checks",{"title":390,"path":391,"stem":392,"icon":384},"Lint and test a plugin","\u002Fbuild\u002Fplugins\u002Fdevelop-and-test\u002Flint-and-tests","04.build\u002F01.plugins\u002F07.develop-and-test\u002F02.lint-and-tests",{"title":394,"path":395,"stem":396,"icon":384},"Run failure drills","\u002Fbuild\u002Fplugins\u002Fdevelop-and-test\u002Ftests-and-drills","04.build\u002F01.plugins\u002F07.develop-and-test\u002F03.tests-and-drills",{"title":398,"path":399,"stem":400,"children":401,"icon":403},"Build in Studio","\u002Fbuild\u002Fplugins\u002Fstudio","04.build\u002F01.plugins\u002F08.studio\u002F00.index",[402,404,408],{"title":398,"path":399,"stem":400,"icon":403},"i-ph-code",{"title":405,"path":406,"stem":407,"icon":403},"Test and explain a draft","\u002Fbuild\u002Fplugins\u002Fstudio\u002Ftest-and-explain","04.build\u002F01.plugins\u002F08.studio\u002F01.test-and-explain",{"title":409,"path":410,"stem":411,"icon":403},"Release a workspace plugin","\u002Fbuild\u002Fplugins\u002Fstudio\u002Frelease","04.build\u002F01.plugins\u002F08.studio\u002F02.release",{"title":413,"path":414,"stem":415,"icon":416},"The build kit","\u002Fbuild\u002Fplugins\u002Fclaude-code","04.build\u002F01.plugins\u002F09.claude-code","i-ph-sparkle",{"title":418,"path":419,"stem":420,"icon":421},"Example: support triage","\u002Fbuild\u002Fplugins\u002Fexample-support-triage","04.build\u002F01.plugins\u002F10.example-support-triage","i-ph-lifebuoy",{"title":423,"path":424,"stem":425,"icon":426},"Publish and version","\u002Fbuild\u002Fplugins\u002Fpublish","04.build\u002F01.plugins\u002F11.publish","i-ph-tag",{"title":428,"path":429,"stem":430,"children":431,"icon":433},"List a plugin","\u002Fbuild\u002Fplugins\u002Flist-a-plugin","04.build\u002F01.plugins\u002F12.list-a-plugin\u002F00.index",[432,434,438],{"title":428,"path":429,"stem":430,"icon":433},"i-ph-storefront",{"title":435,"path":436,"stem":437,"icon":433},"Hub review checks","\u002Fbuild\u002Fplugins\u002Flist-a-plugin\u002Freview","04.build\u002F01.plugins\u002F12.list-a-plugin\u002F01.review",{"title":439,"path":440,"stem":441,"icon":433},"Maintain a listing","\u002Fbuild\u002Fplugins\u002Flist-a-plugin\u002Fmaintain","04.build\u002F01.plugins\u002F12.list-a-plugin\u002F02.maintain",{"title":443,"path":444,"stem":445,"icon":446},"The catalog","\u002Fbuild\u002Fplugins\u002Fcatalog","04.build\u002F01.plugins\u002F13.catalog","i-ph-books",{"title":448,"path":449,"stem":450,"icon":451},"Folders, bundles and OCI","\u002Fbuild\u002Fplugins\u002Fsources","04.build\u002F01.plugins\u002F14.sources","i-ph-archive",{"title":453,"path":454,"stem":455,"icon":456},"The workspace","\u002Fbuild\u002Fplugins\u002Fworkspace","04.build\u002F01.plugins\u002F15.workspace","i-ph-folder-notch-open",{"title":458,"path":459,"stem":460,"children":461,"icon":463},"Use a plugin index","\u002Fbuild\u002Fplugins\u002Findexes","04.build\u002F01.plugins\u002F16.indexes\u002F00.index",[462,464,468],{"title":458,"path":459,"stem":460,"icon":463},"i-ph-seal-check",{"title":465,"path":466,"stem":467,"icon":463},"Read index version records","\u002Fbuild\u002Fplugins\u002Findexes\u002Fversion-records","04.build\u002F01.plugins\u002F16.indexes\u002F01.version-records",{"title":469,"path":470,"stem":471,"icon":463},"Manage plugin indexes","\u002Fbuild\u002Fplugins\u002Findexes\u002Fmanage","04.build\u002F01.plugins\u002F16.indexes\u002F02.manage",{"title":473,"path":474,"stem":475,"icon":327},"Existing MCP packages","\u002Fbuild\u002Fplugins\u002Fpackages","04.build\u002F01.plugins\u002F17.packages",{"title":477,"path":478,"stem":479,"icon":480},"MCP servers from container images","\u002Fbuild\u002Fplugins\u002Fcontainer-images","04.build\u002F01.plugins\u002F18.container-images","i-ph-cube",{"title":482,"path":483,"stem":484,"children":485,"icon":487},"Import agent plugins","\u002Fbuild\u002Fplugins\u002Fclaude-code-and-agent-plugins","04.build\u002F01.plugins\u002F19.claude-code-and-agent-plugins\u002F00.index",[486,488],{"title":482,"path":483,"stem":484,"icon":487},"i-ph-arrow-square-in",{"title":489,"path":490,"stem":491,"icon":487},"Import from registries","\u002Fbuild\u002Fplugins\u002Fclaude-code-and-agent-plugins\u002Fmarketplaces","04.build\u002F01.plugins\u002F19.claude-code-and-agent-plugins\u002F01.marketplaces",{"title":493,"path":494,"stem":495,"icon":496},"GitHub","\u002Fbuild\u002Fplugins\u002Fgithub","04.build\u002F01.plugins\u002F20.github","i-ph-github-logo",{"title":498,"path":499,"stem":500,"icon":501},"Known vulnerabilities","\u002Fbuild\u002Fplugins\u002Fvulnerabilities","04.build\u002F01.plugins\u002F21.vulnerabilities","i-ph-shield-warning",{"title":503,"path":504,"stem":505,"children":506,"icon":71},"Verified plugins","\u002Fbuild\u002Fplugins\u002Fverified","04.build\u002F01.plugins\u002F22.verified\u002F01.index",[507,508,513,518,523,528,533,538,543,548,553,558,580,585,589,594,599,604,608,612,617,622,626],{"title":503,"path":504,"stem":505,"icon":463},{"title":509,"path":510,"stem":511,"icon":512},"ai.oz0\u002Fweb","\u002Fbuild\u002Fplugins\u002Fverified\u002Fweb","04.build\u002F01.plugins\u002F22.verified\u002F02.web","i-ph-globe",{"title":514,"path":515,"stem":516,"icon":517},"ai.oz0\u002Fnet-diag","\u002Fbuild\u002Fplugins\u002Fverified\u002Fnet-diag","04.build\u002F01.plugins\u002F22.verified\u002F03.net-diag","i-ph-network",{"title":519,"path":520,"stem":521,"icon":522},"ai.oz0\u002Fcve-triage","\u002Fbuild\u002Fplugins\u002Fverified\u002Fcve-triage","04.build\u002F01.plugins\u002F22.verified\u002F04.cve-triage","i-ph-bug",{"title":524,"path":525,"stem":526,"icon":527},"ai.oz0\u002Fhost-health","\u002Fbuild\u002Fplugins\u002Fverified\u002Fhost-health","04.build\u002F01.plugins\u002F22.verified\u002F05.host-health","i-ph-heartbeat",{"title":529,"path":530,"stem":531,"icon":532},"ai.oz0\u002Fpr-reviewer","\u002Fbuild\u002Fplugins\u002Fverified\u002Fpr-reviewer","04.build\u002F01.plugins\u002F22.verified\u002F06.pr-reviewer","i-ph-git-pull-request",{"title":534,"path":535,"stem":536,"icon":537},"Slack","\u002Fbuild\u002Fplugins\u002Fverified\u002Fslack","04.build\u002F01.plugins\u002F22.verified\u002F07.slack","i-ph-slack-logo",{"title":539,"path":540,"stem":541,"icon":542},"Discord","\u002Fbuild\u002Fplugins\u002Fverified\u002Fdiscord","04.build\u002F01.plugins\u002F22.verified\u002F08.discord","i-ph-discord-logo",{"title":544,"path":545,"stem":546,"icon":547},"Microsoft Teams","\u002Fbuild\u002Fplugins\u002Fverified\u002Fteams","04.build\u002F01.plugins\u002F22.verified\u002F09.teams","i-ph-microsoft-teams-logo",{"title":549,"path":550,"stem":551,"icon":552},"ai.oz0\u002Fai-spend","\u002Fbuild\u002Fplugins\u002Fverified\u002Fai-spend","04.build\u002F01.plugins\u002F22.verified\u002F10.ai-spend","i-ph-coins",{"title":554,"path":555,"stem":556,"icon":557},"ai.oz0\u002Fa2a-remote","\u002Fbuild\u002Fplugins\u002Fverified\u002Fa2a-remote","04.build\u002F01.plugins\u002F22.verified\u002F11.a2a-remote","i-ph-arrows-left-right",{"title":559,"path":560,"stem":561,"children":562,"icon":98},"Guardrails","\u002Fbuild\u002Fplugins\u002Fverified\u002Fguardrails","04.build\u002F01.plugins\u002F22.verified\u002F12.guardrails\u002F00.index",[563,564,568,572,576],{"title":559,"path":560,"stem":561,"icon":98},{"title":565,"path":566,"stem":567,"icon":98},"Configure guardrails","\u002Fbuild\u002Fplugins\u002Fverified\u002Fguardrails\u002Fsettings","04.build\u002F01.plugins\u002F22.verified\u002F12.guardrails\u002F01.settings",{"title":569,"path":570,"stem":571,"icon":98},"Check classified text","\u002Fbuild\u002Fplugins\u002Fverified\u002Fguardrails\u002Fclassified-text","04.build\u002F01.plugins\u002F22.verified\u002F12.guardrails\u002F02.classified-text",{"title":573,"path":574,"stem":575,"icon":98},"Check shell commands","\u002Fbuild\u002Fplugins\u002Fverified\u002Fguardrails\u002Fcommands","04.build\u002F01.plugins\u002F22.verified\u002F12.guardrails\u002F03.commands",{"title":577,"path":578,"stem":579,"icon":98},"Guardrail coverage and limits","\u002Fbuild\u002Fplugins\u002Fverified\u002Fguardrails\u002Fintent-and-limits","04.build\u002F01.plugins\u002F22.verified\u002F12.guardrails\u002F04.intent-and-limits",{"title":581,"path":582,"stem":583,"icon":584},"ai.oz0\u002Fmemory","\u002Fbuild\u002Fplugins\u002Fverified\u002Fmemory","04.build\u002F01.plugins\u002F22.verified\u002F13.memory","i-ph-brain",{"title":586,"path":587,"stem":588,"icon":416},"ai.oz0\u002Fsetup-assistant","\u002Fbuild\u002Fplugins\u002Fverified\u002Fsetup-assistant","04.build\u002F01.plugins\u002F22.verified\u002F14.setup-assistant",{"title":590,"path":591,"stem":592,"icon":593},"ai.oz0\u002Fpublic-access","\u002Fbuild\u002Fplugins\u002Fverified\u002Fpublic-access","04.build\u002F01.plugins\u002F22.verified\u002F15.public-access","i-ph-files",{"title":595,"path":596,"stem":597,"icon":598},"ai.oz0\u002Femail","\u002Fbuild\u002Fplugins\u002Fverified\u002Femail","04.build\u002F01.plugins\u002F22.verified\u002F16.email","i-ph-envelope-simple",{"title":600,"path":601,"stem":602,"icon":603},"Atlassian Cloud","\u002Fbuild\u002Fplugins\u002Fverified\u002Fatlassian","04.build\u002F01.plugins\u002F22.verified\u002F17.atlassian","i-ph-kanban",{"title":605,"path":606,"stem":607,"icon":603},"Atlassian Data Center","\u002Fbuild\u002Fplugins\u002Fverified\u002Fatlassian-dc","04.build\u002F01.plugins\u002F22.verified\u002F18.atlassian-dc",{"title":609,"path":610,"stem":611,"icon":421},"ServiceNow","\u002Fbuild\u002Fplugins\u002Fverified\u002Fservicenow","04.build\u002F01.plugins\u002F22.verified\u002F19.servicenow",{"title":613,"path":614,"stem":615,"icon":616},"GitLab","\u002Fbuild\u002Fplugins\u002Fverified\u002Fgitlab","04.build\u002F01.plugins\u002F22.verified\u002F20.gitlab","i-ph-git-merge",{"title":618,"path":619,"stem":620,"icon":621},"Support triage","\u002Fbuild\u002Fplugins\u002Fverified\u002Fsupport-triage","04.build\u002F01.plugins\u002F22.verified\u002F21.support-triage","i-ph-ticket",{"title":623,"path":624,"stem":625,"icon":361},"Essentials","\u002Fbuild\u002Fplugins\u002Fverified\u002Fessentials","04.build\u002F01.plugins\u002F22.verified\u002F22.essentials",{"title":627,"path":628,"stem":629,"children":630,"icon":532},"Plugin improver","\u002Fbuild\u002Fplugins\u002Fverified\u002Fplugin-improver","04.build\u002F01.plugins\u002F22.verified\u002F23.plugin-improver\u002F00.index",[631,632,636],{"title":627,"path":628,"stem":629,"icon":532},{"title":633,"path":634,"stem":635,"icon":532},"How an improvement runs","\u002Fbuild\u002Fplugins\u002Fverified\u002Fplugin-improver\u002Fjob-lifecycle","04.build\u002F01.plugins\u002F22.verified\u002F23.plugin-improver\u002F01.job-lifecycle",{"title":637,"path":638,"stem":639,"icon":532},"Improver limits and records","\u002Fbuild\u002Fplugins\u002Fverified\u002Fplugin-improver\u002Flimits-and-records","04.build\u002F01.plugins\u002F22.verified\u002F23.plugin-improver\u002F02.limits-and-records",{"title":641,"path":642,"stem":643,"children":644,"icon":646},"Plugin size limits","\u002Fbuild\u002Fplugins\u002Flimits","04.build\u002F01.plugins\u002F23.limits\u002F00.index",[645,647,651],{"title":641,"path":642,"stem":643,"icon":646},"i-ph-ruler",{"title":648,"path":649,"stem":650,"icon":646},"Documentation limits","\u002Fbuild\u002Fplugins\u002Flimits\u002Fdocumentation","04.build\u002F01.plugins\u002F23.limits\u002F01.documentation",{"title":652,"path":653,"stem":654,"icon":646},"Artifact and index limits","\u002Fbuild\u002Fplugins\u002Flimits\u002Fartifacts","04.build\u002F01.plugins\u002F23.limits\u002F02.artifacts",{"title":656,"path":657,"stem":658,"children":659,"icon":71},"Parts","\u002Fbuild\u002Fparts","04.build\u002F02.parts\u002F00.index",[660,662,667,672,690,721,726,730,741,756,761,776,791,814,818,823,828,839],{"title":661,"path":657,"stem":658},"Plugin parts",{"title":663,"path":664,"stem":665,"icon":666},"Agents","\u002Fbuild\u002Fparts\u002Fagents","04.build\u002F02.parts\u002F01.agents","i-ph-robot",{"title":668,"path":669,"stem":670,"icon":671},"What an agent combines","\u002Fbuild\u002Fparts\u002Fwhat-an-agent-combines","04.build\u002F02.parts\u002F02.what-an-agent-combines","i-ph-intersect-three",{"title":673,"path":674,"stem":675,"children":676,"icon":646},"Agent contracts","\u002Fbuild\u002Fparts\u002Fcontracts-and-limits","04.build\u002F02.parts\u002F03.contracts-and-limits\u002F00.index",[677,678,682,686],{"title":673,"path":674,"stem":675,"icon":646},{"title":679,"path":680,"stem":681,"icon":646},"Agent failure kinds","\u002Fbuild\u002Fparts\u002Fcontracts-and-limits\u002Ffailures","04.build\u002F02.parts\u002F03.contracts-and-limits\u002F01.failures",{"title":683,"path":684,"stem":685,"icon":646},"Agent limits","\u002Fbuild\u002Fparts\u002Fcontracts-and-limits\u002Flimits","04.build\u002F02.parts\u002F03.contracts-and-limits\u002F02.limits",{"title":687,"path":688,"stem":689,"icon":646},"Agent budgets","\u002Fbuild\u002Fparts\u002Fcontracts-and-limits\u002Fbudgets","04.build\u002F02.parts\u002F03.contracts-and-limits\u002F03.budgets",{"title":691,"path":692,"stem":693,"children":694,"icon":696},"Write a tool","\u002Fbuild\u002Fparts\u002Ftools","04.build\u002F02.parts\u002F04.tools\u002F00.index",[695,697,701,705,709,713,717],{"title":691,"path":692,"stem":693,"icon":696},"i-ph-wrench",{"title":698,"path":699,"stem":700,"icon":696},"Describe tool functions","\u002Fbuild\u002Fparts\u002Ftools\u002Fdefinitions","04.build\u002F02.parts\u002F04.tools\u002F01.definitions",{"title":702,"path":703,"stem":704,"icon":696},"Return results and files","\u002Fbuild\u002Fparts\u002Ftools\u002Fresults-and-files","04.build\u002F02.parts\u002F04.tools\u002F02.results-and-files",{"title":706,"path":707,"stem":708,"icon":696},"Handle tool call lifecycle","\u002Fbuild\u002Fparts\u002Ftools\u002Fcall-lifecycle","04.build\u002F02.parts\u002F04.tools\u002F03.call-lifecycle",{"title":710,"path":711,"stem":712,"icon":696},"Pin tool definitions","\u002Fbuild\u002Fparts\u002Ftools\u002Fsnapshots","04.build\u002F02.parts\u002F04.tools\u002F04.snapshots",{"title":714,"path":715,"stem":716,"icon":696},"Call a model from a tool","\u002Fbuild\u002Fparts\u002Ftools\u002Fmodel-calls","04.build\u002F02.parts\u002F04.tools\u002F05.model-calls",{"title":718,"path":719,"stem":720,"icon":696},"Tool labels and approvals","\u002Fbuild\u002Fparts\u002Ftools\u002Fpolicy","04.build\u002F02.parts\u002F04.tools\u002F06.policy",{"title":722,"path":723,"stem":724,"icon":725},"TypeScript tools","\u002Fbuild\u002Fparts\u002Ftypescript-tools","04.build\u002F02.parts\u002F05.typescript-tools","i-ph-file-code",{"title":727,"path":728,"stem":729,"icon":725},"Import an OpenAPI document","\u002Fbuild\u002Fparts\u002Fopenapi-import","04.build\u002F02.parts\u002F06.openapi-import",{"title":731,"path":732,"stem":733,"children":734,"icon":736},"Write and load skills","\u002Fbuild\u002Fparts\u002Fskills","04.build\u002F02.parts\u002F07.skills\u002F00.index",[735,737],{"title":731,"path":732,"stem":733,"icon":736},"i-ph-graduation-cap",{"title":738,"path":739,"stem":740,"icon":736},"Review skill use and proposals","\u002Fbuild\u002Fparts\u002Fskills\u002Fusage-and-proposals","04.build\u002F02.parts\u002F07.skills\u002F01.usage-and-proposals",{"title":742,"path":743,"stem":744,"children":745,"icon":747},"Write a flow","\u002Fbuild\u002Fparts\u002Fflows","04.build\u002F02.parts\u002F08.flows\u002F00.index",[746,748,752],{"title":742,"path":743,"stem":744,"icon":747},"i-ph-flow-arrow",{"title":749,"path":750,"stem":751,"icon":747},"Flow steps and expressions","\u002Fbuild\u002Fparts\u002Fflows\u002Fsteps-and-expressions","04.build\u002F02.parts\u002F08.flows\u002F01.steps-and-expressions",{"title":753,"path":754,"stem":755,"icon":747},"Expose and explain flows","\u002Fbuild\u002Fparts\u002Fflows\u002Fflow-tools","04.build\u002F02.parts\u002F08.flows\u002F02.flow-tools",{"title":757,"path":758,"stem":759,"icon":760},"Hooks","\u002Fbuild\u002Fparts\u002Fhooks","04.build\u002F02.parts\u002F09.hooks","i-ph-anchor",{"title":762,"path":763,"stem":764,"children":765,"icon":767},"Declare an event source","\u002Fbuild\u002Fparts\u002Fevent-sources","04.build\u002F02.parts\u002F10.event-sources\u002F00.index",[766,768,772],{"title":762,"path":763,"stem":764,"icon":767},"i-ph-broadcast",{"title":769,"path":770,"stem":771,"icon":767},"Bind and answer deliveries","\u002Fbuild\u002Fparts\u002Fevent-sources\u002Fdelivery-binding","04.build\u002F02.parts\u002F10.event-sources\u002F01.delivery-binding",{"title":773,"path":774,"stem":775,"icon":767},"Use platform events","\u002Fbuild\u002Fparts\u002Fevent-sources\u002Fplatform-events","04.build\u002F02.parts\u002F10.event-sources\u002F02.platform-events",{"title":777,"path":778,"stem":779,"children":780,"icon":782},"Declare a connection","\u002Fbuild\u002Fparts\u002Fconnections","04.build\u002F02.parts\u002F11.connections\u002F00.index",[781,783,787],{"title":777,"path":778,"stem":779,"icon":782},"i-ph-plugs-connected",{"title":784,"path":785,"stem":786,"icon":782},"Connection token lifecycle","\u002Fbuild\u002Fparts\u002Fconnections\u002Ftoken-lifecycle","04.build\u002F02.parts\u002F11.connections\u002F01.token-lifecycle",{"title":788,"path":789,"stem":790,"icon":782},"Connection setup and security","\u002Fbuild\u002Fparts\u002Fconnections\u002Fsetup-and-security","04.build\u002F02.parts\u002F11.connections\u002F02.setup-and-security",{"title":792,"path":793,"stem":794,"children":795,"icon":797},"Choose a harness","\u002Fbuild\u002Fparts\u002Fharnesses","04.build\u002F02.parts\u002F12.harnesses\u002F00.index",[796,798,802,806,810],{"title":792,"path":793,"stem":794,"icon":797},"i-ph-cpu",{"title":799,"path":800,"stem":801,"icon":797},"Harness tool controls","\u002Fbuild\u002Fparts\u002Fharnesses\u002Ftool-controls","04.build\u002F02.parts\u002F12.harnesses\u002F01.tool-controls",{"title":803,"path":804,"stem":805,"icon":797},"Recover a harness session","\u002Fbuild\u002Fparts\u002Fharnesses\u002Frecovery","04.build\u002F02.parts\u002F12.harnesses\u002F02.recovery",{"title":807,"path":808,"stem":809,"icon":797},"Write a harness","\u002Fbuild\u002Fparts\u002Fharnesses\u002Fcustom-harnesses","04.build\u002F02.parts\u002F12.harnesses\u002F03.custom-harnesses",{"title":811,"path":812,"stem":813,"icon":797},"Use an ACP agent","\u002Fbuild\u002Fparts\u002Fharnesses\u002Facp","04.build\u002F02.parts\u002F12.harnesses\u002F04.acp",{"title":815,"path":816,"stem":817,"icon":782},"Bring your own agent","\u002Fbuild\u002Fparts\u002Fbring-your-own-agent","04.build\u002F02.parts\u002F13.bring-your-own-agent",{"title":819,"path":820,"stem":821,"icon":822},"Records and start-up text","\u002Fbuild\u002Fparts\u002Frecords-and-startup","04.build\u002F02.parts\u002F14.records-and-startup","i-ph-database",{"title":824,"path":825,"stem":826,"icon":827},"Addresses","\u002Fbuild\u002Fparts\u002Faddresses","04.build\u002F02.parts\u002F15.addresses","i-ph-signpost",{"title":829,"path":830,"stem":831,"children":832,"icon":834},"Define a routine","\u002Fbuild\u002Fparts\u002Froutines","04.build\u002F02.parts\u002F16.routines\u002F00.index",[833,835],{"title":829,"path":830,"stem":831,"icon":834},"i-ph-clock-clockwise",{"title":836,"path":837,"stem":838,"icon":834},"Routine permissions and outputs","\u002Fbuild\u002Fparts\u002Froutines\u002Foutputs-and-permissions","04.build\u002F02.parts\u002F16.routines\u002F01.outputs-and-permissions",{"title":840,"path":841,"stem":842,"icon":843},"When to split an agent","\u002Fbuild\u002Fparts\u002Fwhen-to-split-an-agent","04.build\u002F02.parts\u002F17.when-to-split-an-agent","i-ph-arrows-split",{"title":845,"path":846,"stem":847,"children":848,"icon":71},"Apps on OZ","\u002Fbuild\u002Fapps","04.build\u002F03.apps\u002F00.index",[849,851,862,867,872,876,880,884,894,908,913,928,942],{"title":850,"path":846,"stem":847},"Applications and clients",{"title":852,"path":853,"stem":854,"children":855,"icon":857},"Use the runtime API","\u002Fbuild\u002Fapps\u002Fruntime-api","04.build\u002F03.apps\u002F01.runtime-api\u002F00.index",[856,858],{"title":852,"path":853,"stem":854,"icon":857},"i-ph-plug",{"title":859,"path":860,"stem":861,"icon":857},"Runtime API authentication","\u002Fbuild\u002Fapps\u002Fruntime-api\u002Fauthentication","04.build\u002F03.apps\u002F01.runtime-api\u002F01.authentication",{"title":863,"path":864,"stem":865,"icon":866},"Python SDK","\u002Fbuild\u002Fapps\u002Fsdk-python","04.build\u002F03.apps\u002F02.sdk-python","i-ph-file-py",{"title":868,"path":869,"stem":870,"icon":871},"TypeScript SDK","\u002Fbuild\u002Fapps\u002Fsdk-typescript","04.build\u002F03.apps\u002F03.sdk-typescript","i-ph-file-ts",{"title":873,"path":874,"stem":875,"icon":725},"Go SDK","\u002Fbuild\u002Fapps\u002Fsdk-go","04.build\u002F03.apps\u002F04.sdk-go",{"title":877,"path":878,"stem":879,"icon":782},"AG-UI for your apps","\u002Fbuild\u002Fapps\u002Fag-ui","04.build\u002F03.apps\u002F05.ag-ui",{"title":881,"path":882,"stem":883,"icon":249},"A chat in your own app","\u002Fbuild\u002Fapps\u002Fchat-app","04.build\u002F03.apps\u002F06.chat-app",{"title":885,"path":886,"stem":887,"children":888,"icon":767},"Follow live jobs","\u002Fbuild\u002Fapps\u002Flive-feeds","04.build\u002F03.apps\u002F07.live-feeds\u002F00.index",[889,890],{"title":885,"path":886,"stem":887,"icon":767},{"title":891,"path":892,"stem":893,"icon":767},"Feed access and browser streams","\u002Fbuild\u002Fapps\u002Flive-feeds\u002Fbrowser-and-access","04.build\u002F03.apps\u002F07.live-feeds\u002F01.browser-and-access",{"title":895,"path":896,"stem":897,"children":898,"icon":782},"Call agents over MCP","\u002Fbuild\u002Fapps\u002Fmcp-server","04.build\u002F03.apps\u002F08.mcp-server\u002F00.index",[899,900,904],{"title":895,"path":896,"stem":897,"icon":782},{"title":901,"path":902,"stem":903,"icon":782},"MCP client OAuth","\u002Fbuild\u002Fapps\u002Fmcp-server\u002Foauth","04.build\u002F03.apps\u002F08.mcp-server\u002F01.oauth",{"title":905,"path":906,"stem":907,"icon":782},"MCP security and limits","\u002Fbuild\u002Fapps\u002Fmcp-server\u002Fsecurity-and-limits","04.build\u002F03.apps\u002F08.mcp-server\u002F02.security-and-limits",{"title":909,"path":910,"stem":911,"icon":912},"A2A agents","\u002Fbuild\u002Fapps\u002Fa2a","04.build\u002F03.apps\u002F09.a2a","i-ph-share-network",{"title":914,"path":915,"stem":916,"children":917,"icon":919},"Run a remote agent","\u002Fbuild\u002Fapps\u002Fremote-agents","04.build\u002F03.apps\u002F10.remote-agents\u002F00.index",[918,920,924],{"title":914,"path":915,"stem":916,"icon":919},"i-ph-cloud-arrow-down",{"title":921,"path":922,"stem":923,"icon":919},"Remote sessions and limits","\u002Fbuild\u002Fapps\u002Fremote-agents\u002Fsessions-and-limits","04.build\u002F03.apps\u002F10.remote-agents\u002F01.sessions-and-limits",{"title":925,"path":926,"stem":927,"icon":919},"Connect an outside A2A agent","\u002Fbuild\u002Fapps\u002Fremote-agents\u002Fa2a","04.build\u002F03.apps\u002F10.remote-agents\u002F02.a2a",{"title":929,"path":930,"stem":931,"children":932,"icon":249},"Connect a chat channel","\u002Fbuild\u002Fapps\u002Fchat-channels","04.build\u002F03.apps\u002F11.chat-channels\u002F00.index",[933,934,938],{"title":929,"path":930,"stem":931,"icon":249},{"title":935,"path":936,"stem":937,"icon":249},"Chat channel conversations","\u002Fbuild\u002Fapps\u002Fchat-channels\u002Fconversations","04.build\u002F03.apps\u002F11.chat-channels\u002F01.conversations",{"title":939,"path":940,"stem":941,"icon":249},"Build a chat channel","\u002Fbuild\u002Fapps\u002Fchat-channels\u002Fbuild","04.build\u002F03.apps\u002F11.chat-channels\u002F02.build",{"title":943,"path":944,"stem":945,"icon":946},"Interop matrix","\u002Fbuild\u002Fapps\u002Finterop","04.build\u002F03.apps\u002F12.interop","i-ph-check-square-offset",{"title":948,"path":949,"stem":950,"children":951,"icon":71},"Improve","\u002Fimprove","05.improve\u002F00.index",[952,953,958,963,968,994,1021,1026,1031,1036],{"title":948,"path":949,"stem":950},{"title":954,"path":955,"stem":956,"icon":957},"Search, compare and fix","\u002Fimprove\u002Fsearch-and-compare","05.improve\u002F01.search-and-compare","i-ph-magnifying-glass",{"title":959,"path":960,"stem":961,"icon":962},"Errors and insights","\u002Fimprove\u002Ferrors-and-insights","05.improve\u002F02.errors-and-insights","i-ph-chart-line",{"title":964,"path":965,"stem":966,"icon":967},"Measured savings","\u002Fimprove\u002Fmeasured-savings","05.improve\u002F03.measured-savings","i-ph-scales",{"title":969,"path":970,"stem":971,"children":972,"icon":463},"Evals and quality gates","\u002Fimprove\u002Fevals","05.improve\u002F04.evals\u002F00.index",[973,974,978,982,986,990],{"title":969,"path":970,"stem":971,"icon":463},{"title":975,"path":976,"stem":977},"Case expectations","\u002Fimprove\u002Fevals\u002Fcases","05.improve\u002F04.evals\u002F01.cases",{"title":979,"path":980,"stem":981},"Record and replay answers","\u002Fimprove\u002Fevals\u002Frecordings","05.improve\u002F04.evals\u002F02.recordings",{"title":983,"path":984,"stem":985},"Check policy paths","\u002Fimprove\u002Fevals\u002Fcoverage","05.improve\u002F04.evals\u002F03.coverage",{"title":987,"path":988,"stem":989},"Gate a plugin update","\u002Fimprove\u002Fevals\u002Fquality-gates","05.improve\u002F04.evals\u002F04.quality-gates",{"title":991,"path":992,"stem":993},"Track quality and regressions","\u002Fimprove\u002Fevals\u002Fregressions","05.improve\u002F04.evals\u002F05.regressions",{"title":995,"path":996,"stem":997,"children":998,"icon":1000},"Outcome checks and patterns","\u002Fimprove\u002Foutcome-checks","05.improve\u002F05.outcome-checks\u002F00.index",[999,1001,1005,1009,1013,1017],{"title":995,"path":996,"stem":997,"icon":1000},"i-ph-gavel",{"title":1002,"path":1003,"stem":1004},"Choose a judge and rubric","\u002Fimprove\u002Foutcome-checks\u002Fjudges","05.improve\u002F05.outcome-checks\u002F01.judges",{"title":1006,"path":1007,"stem":1008},"Measure a judge over time","\u002Fimprove\u002Foutcome-checks\u002Fsampling","05.improve\u002F05.outcome-checks\u002F02.sampling",{"title":1010,"path":1011,"stem":1012},"Use a reviewer agent","\u002Fimprove\u002Foutcome-checks\u002Freviewer","05.improve\u002F05.outcome-checks\u002F03.reviewer",{"title":1014,"path":1015,"stem":1016},"Choose among candidate answers","\u002Fimprove\u002Foutcome-checks\u002Fselection","05.improve\u002F05.outcome-checks\u002F04.selection",{"title":1018,"path":1019,"stem":1020},"Test and roll out judged agents","\u002Fimprove\u002Foutcome-checks\u002Frollouts","05.improve\u002F05.outcome-checks\u002F05.rollouts",{"title":1022,"path":1023,"stem":1024,"icon":1025},"Measured results","\u002Fimprove\u002Fmeasured-results","05.improve\u002F06.measured-results","i-ph-chart-bar",{"title":1027,"path":1028,"stem":1029,"icon":1030},"Comparisons of a changed agent","\u002Fimprove\u002Fcomparisons-of-a-changed-agent","05.improve\u002F07.comparisons-of-a-changed-agent","i-ph-git-diff",{"title":1032,"path":1033,"stem":1034,"icon":1035},"Where a fix belongs","\u002Fimprove\u002Fwhere-a-fix-belongs","05.improve\u002F08.where-a-fix-belongs","i-ph-ladder",{"title":1037,"path":1038,"stem":1039,"icon":957},"Evidence for agents","\u002Fimprove\u002Fevidence-for-agents","05.improve\u002F09.evidence-for-agents",{"title":1041,"path":1042,"stem":1043,"children":1044,"icon":71},"Govern","\u002Fgovern","06.govern\u002F00.index",[1045,1047,1085,1089,1111,1115,1120,1151,1170,1175,1180,1184,1207],{"title":1046,"path":1042,"stem":1043},"Govern agents",{"title":1048,"path":1049,"stem":1050,"children":1051,"icon":98},"Tool policy","\u002Fgovern\u002Ftool-policy","06.govern\u002F01.tool-policy\u002F00.index",[1052,1053,1057,1061,1065,1069,1073,1077,1081],{"title":1048,"path":1049,"stem":1050,"icon":98},{"title":1054,"path":1055,"stem":1056},"Export and apply a tool policy","\u002Fgovern\u002Ftool-policy\u002Ffiles","06.govern\u002F01.tool-policy\u002F02.files",{"title":1058,"path":1059,"stem":1060},"Rules for plugin and remote functions","\u002Fgovern\u002Ftool-policy\u002Fplugin-functions","06.govern\u002F01.tool-policy\u002F03.plugin-functions",{"title":1062,"path":1063,"stem":1064},"Function conditions and action classes","\u002Fgovern\u002Ftool-policy\u002Fconditions","06.govern\u002F01.tool-policy\u002F04.conditions",{"title":1066,"path":1067,"stem":1068},"Rules for taint, origins and sequences","\u002Fgovern\u002Ftool-policy\u002Forigins-and-sequences","06.govern\u002F01.tool-policy\u002F05.origins-and-sequences",{"title":1070,"path":1071,"stem":1072},"How the runtime enforces tool policy","\u002Fgovern\u002Ftool-policy\u002Fruntime","06.govern\u002F01.tool-policy\u002F06.runtime",{"title":1074,"path":1075,"stem":1076},"Preview, review and lint tool policy changes","\u002Fgovern\u002Ftool-policy\u002Freview-changes","06.govern\u002F01.tool-policy\u002F07.review-changes",{"title":1078,"path":1079,"stem":1080},"Assign duties to tool calls","\u002Fgovern\u002Ftool-policy\u002Fduties","06.govern\u002F01.tool-policy\u002F08.duties",{"title":1082,"path":1083,"stem":1084},"Command rules in a tool policy","\u002Fgovern\u002Ftool-policy\u002Fcommand-rules","06.govern\u002F01.tool-policy\u002F09.command-rules",{"title":1086,"path":1087,"stem":1088,"icon":230},"Governance replay","\u002Fgovern\u002Fgovernance-replay","06.govern\u002F02.governance-replay",{"title":1090,"path":1091,"stem":1092,"children":1093,"icon":532},"Reviewed changes","\u002Fgovern\u002Freviewed-changes","06.govern\u002F03.reviewed-changes\u002F00.index",[1094,1095,1099,1103,1107],{"title":1090,"path":1091,"stem":1092,"icon":532},{"title":1096,"path":1097,"stem":1098},"Review assistant and job proposals","\u002Fgovern\u002Freviewed-changes\u002Fproposals","06.govern\u002F03.reviewed-changes\u002F02.proposals",{"title":1100,"path":1101,"stem":1102},"Review plugin configurations","\u002Fgovern\u002Freviewed-changes\u002Fplugin-configurations","06.govern\u002F03.reviewed-changes\u002F03.plugin-configurations",{"title":1104,"path":1105,"stem":1106},"Review and roll back changesets","\u002Fgovern\u002Freviewed-changes\u002Fchangesets","06.govern\u002F03.reviewed-changes\u002F04.changesets",{"title":1108,"path":1109,"stem":1110},"Review changes to protected paths","\u002Fgovern\u002Freviewed-changes\u002Fprotected-paths","06.govern\u002F03.reviewed-changes\u002F05.protected-paths",{"title":1112,"path":1113,"stem":1114,"icon":666},"AI labels","\u002Fgovern\u002Fai-labels","06.govern\u002F04.ai-labels",{"title":1116,"path":1117,"stem":1118,"icon":1119},"Kill switches","\u002Fgovern\u002Fkill-switches","06.govern\u002F05.kill-switches","i-ph-power",{"title":1121,"path":1122,"stem":1123,"children":1124,"icon":1126},"Personal data","\u002Fgovern\u002Fpersonal-data","06.govern\u002F06.personal-data\u002F00.index",[1125,1127,1131,1135,1139,1143,1147],{"title":1121,"path":1122,"stem":1123,"icon":1126},"i-ph-user-minus",{"title":1128,"path":1129,"stem":1130},"Associate people and purposes with jobs","\u002Fgovern\u002Fpersonal-data\u002Fassociate-people","06.govern\u002F06.personal-data\u002F01.associate-people",{"title":1132,"path":1133,"stem":1134},"Find and export personal data","\u002Fgovern\u002Fpersonal-data\u002Fexport","06.govern\u002F06.personal-data\u002F02.export",{"title":1136,"path":1137,"stem":1138},"Restrict processing and record contests","\u002Fgovern\u002Fpersonal-data\u002Frestrictions-and-contests","06.govern\u002F06.personal-data\u002F03.restrictions-and-contests",{"title":1140,"path":1141,"stem":1142},"Erase personal data","\u002Fgovern\u002Fpersonal-data\u002Ferase","06.govern\u002F06.personal-data\u002F04.erase",{"title":1144,"path":1145,"stem":1146},"Retain records and restore backups","\u002Fgovern\u002Fpersonal-data\u002Fretention","06.govern\u002F06.personal-data\u002F05.retention",{"title":1148,"path":1149,"stem":1150},"Personal data held by plugins","\u002Fgovern\u002Fpersonal-data\u002Fplugin-records","06.govern\u002F06.personal-data\u002F06.plugin-records",{"title":1152,"path":1153,"stem":1154,"children":1155,"icon":1157},"Taint and labels","\u002Fgovern\u002Ftaint-and-labels","06.govern\u002F07.taint-and-labels\u002F00.index",[1156,1158,1162,1166],{"title":1152,"path":1153,"stem":1154,"icon":1157},"i-ph-drop-half-bottom",{"title":1159,"path":1160,"stem":1161},"Set rules on taint and labels","\u002Fgovern\u002Ftaint-and-labels\u002Frules","06.govern\u002F07.taint-and-labels\u002F02.rules",{"title":1163,"path":1164,"stem":1165},"Set clearance, egress and content walls","\u002Fgovern\u002Ftaint-and-labels\u002Flabel-policies","06.govern\u002F07.taint-and-labels\u002F03.label-policies",{"title":1167,"path":1168,"stem":1169},"Read outside text in a quarantine child","\u002Fgovern\u002Ftaint-and-labels\u002Fquarantine","06.govern\u002F07.taint-and-labels\u002F04.quarantine",{"title":1171,"path":1172,"stem":1173,"icon":1174},"Works-council mode","\u002Fgovern\u002Fworks-council-mode","06.govern\u002F08.works-council-mode","i-ph-users-three",{"title":1176,"path":1177,"stem":1178,"icon":1179},"Incidents","\u002Fgovern\u002Fincidents","06.govern\u002F09.incidents","i-ph-siren",{"title":1181,"path":1182,"stem":1183,"icon":213},"Inventory","\u002Fgovern\u002Finventory","06.govern\u002F10.inventory",{"title":1185,"path":1186,"stem":1187,"children":1188,"icon":1190},"Audit trail","\u002Fgovern\u002Faudit-trail","06.govern\u002F11.audit-trail\u002F00.index",[1189,1191,1195,1199,1203],{"title":1185,"path":1186,"stem":1187,"icon":1190},"i-ph-scroll",{"title":1192,"path":1193,"stem":1194},"Audit records and run identity","\u002Fgovern\u002Faudit-trail\u002Frecords","06.govern\u002F11.audit-trail\u002F02.records",{"title":1196,"path":1197,"stem":1198},"Verify the audit chain","\u002Fgovern\u002Faudit-trail\u002Fverification","06.govern\u002F11.audit-trail\u002F03.verification",{"title":1200,"path":1201,"stem":1202},"Export and verify evidence bundles","\u002Fgovern\u002Faudit-trail\u002Fevidence-bundles","06.govern\u002F11.audit-trail\u002F04.evidence-bundles",{"title":1204,"path":1205,"stem":1206},"Audit retention, erasure and legal holds","\u002Fgovern\u002Faudit-trail\u002Fretention","06.govern\u002F11.audit-trail\u002F05.retention",{"title":1208,"path":1209,"stem":1210,"children":1211,"icon":1213},"Command rules","\u002Fgovern\u002Fcommand-rules","06.govern\u002F12.command-rules\u002F00.index",[1212,1214,1218,1222,1226],{"title":1208,"path":1209,"stem":1210,"icon":1213},"i-ph-terminal",{"title":1215,"path":1216,"stem":1217},"Command rule patterns","\u002Fgovern\u002Fcommand-rules\u002Fpatterns","06.govern\u002F12.command-rules\u002F02.patterns",{"title":1219,"path":1220,"stem":1221},"What the command reader understands","\u002Fgovern\u002Fcommand-rules\u002Fcommand-reader","06.govern\u002F12.command-rules\u002F03.command-reader",{"title":1223,"path":1224,"stem":1225},"Create a command rule from an approval","\u002Fgovern\u002Fcommand-rules\u002Fallow-from-card","06.govern\u002F12.command-rules\u002F04.allow-from-card",{"title":1227,"path":1228,"stem":1229},"Command rule evaluation and limits","\u002Fgovern\u002Fcommand-rules\u002Fevaluation-and-limits","06.govern\u002F12.command-rules\u002F05.evaluation-and-limits",{"title":1231,"path":1232,"stem":1233,"children":1234,"icon":71},"Fleet","\u002Ffleet","07.fleet\u002F00.index",[1235,1237,1242,1247,1251,1256,1260,1265,1270,1274,1278,1297,1302,1307,1325,1329,1333,1352,1357,1380,1385,1390,1395,1399,1458,1462,1467,1481,1486,1490,1494],{"title":1236,"path":1232,"stem":1233},"Operate a fleet",{"title":1238,"path":1239,"stem":1240,"icon":1241},"Dev mode","\u002Ffleet\u002Fdev-mode","07.fleet\u002F01.dev-mode","i-ph-laptop",{"title":1243,"path":1244,"stem":1245,"icon":1246},"Run a cluster","\u002Ffleet\u002Fcluster","07.fleet\u002F02.cluster","i-ph-hard-drives",{"title":1248,"path":1249,"stem":1250,"icon":782},"Join nodes","\u002Ffleet\u002Fjoin-nodes","07.fleet\u002F03.join-nodes",{"title":1252,"path":1253,"stem":1254,"icon":1255},"Manage nodes","\u002Ffleet\u002Fmanage-nodes","07.fleet\u002F04.manage-nodes","i-ph-list-bullets",{"title":1257,"path":1258,"stem":1259,"icon":527},"Node health","\u002Ffleet\u002Fnodes","07.fleet\u002F05.nodes",{"title":1261,"path":1262,"stem":1263,"icon":1264},"Nodes as services","\u002Ffleet\u002Fservices","07.fleet\u002F06.services","i-ph-gear-six",{"title":1266,"path":1267,"stem":1268,"icon":1269},"Doctor","\u002Ffleet\u002Fdoctor","07.fleet\u002F07.doctor","i-ph-stethoscope",{"title":1271,"path":1272,"stem":1273,"icon":421},"Troubleshooting","\u002Ffleet\u002Ftroubleshooting","07.fleet\u002F08.troubleshooting",{"title":1275,"path":1276,"stem":1277,"icon":962},"Tracing and metrics","\u002Ffleet\u002Fobservability","07.fleet\u002F09.observability",{"title":1279,"path":1280,"stem":1281,"children":1282,"icon":1284},"Choose sandbox tier 2","\u002Ffleet\u002Fsandbox-tier-2","07.fleet\u002F10.sandbox-tier-2\u002F00.index",[1283,1285,1289,1293],{"title":1279,"path":1280,"stem":1281,"icon":1284},"i-ph-shield-chevron",{"title":1286,"path":1287,"stem":1288,"icon":1284},"Set up gVisor","\u002Ffleet\u002Fsandbox-tier-2\u002Fgvisor","07.fleet\u002F10.sandbox-tier-2\u002F01.gvisor",{"title":1290,"path":1291,"stem":1292,"icon":1284},"Set up microVM isolation","\u002Ffleet\u002Fsandbox-tier-2\u002Fmicrovms","07.fleet\u002F10.sandbox-tier-2\u002F02.microvms",{"title":1294,"path":1295,"stem":1296,"icon":1284},"Configure remote sandboxes","\u002Ffleet\u002Fsandbox-tier-2\u002Fremote","07.fleet\u002F10.sandbox-tier-2\u002F03.remote",{"title":1298,"path":1299,"stem":1300,"icon":1301},"Sandbox on macOS","\u002Ffleet\u002Fsandbox-on-macos","07.fleet\u002F11.sandbox-on-macos","i-ph-apple-logo",{"title":1303,"path":1304,"stem":1305,"icon":1306},"Sandbox on Windows","\u002Ffleet\u002Fsandbox-on-windows","07.fleet\u002F12.sandbox-on-windows","i-ph-windows-logo",{"title":1308,"path":1309,"stem":1310,"children":1311,"icon":797},"Configure local models","\u002Ffleet\u002Flocal-models","07.fleet\u002F13.local-models\u002F00.index",[1312,1313,1317,1321],{"title":1308,"path":1309,"stem":1310,"icon":797},{"title":1314,"path":1315,"stem":1316,"icon":797},"Share a local model with the fleet","\u002Ffleet\u002Flocal-models\u002Ffleet","07.fleet\u002F13.local-models\u002F01.fleet",{"title":1318,"path":1319,"stem":1320,"icon":797},"Review local-model safety checks","\u002Ffleet\u002Flocal-models\u002Ftrust","07.fleet\u002F13.local-models\u002F02.trust",{"title":1322,"path":1323,"stem":1324,"icon":797},"Size and price local models","\u002Ffleet\u002Flocal-models\u002Fsizing-and-cost","07.fleet\u002F13.local-models\u002F03.sizing-and-cost",{"title":1326,"path":1327,"stem":1328,"icon":1241},"Agents on a Mac with MLX","\u002Ffleet\u002Flocal-models-on-a-mac","07.fleet\u002F14.local-models-on-a-mac",{"title":1330,"path":1331,"stem":1332,"icon":127},"Queues","\u002Ffleet\u002Fqueues","07.fleet\u002F15.queues",{"title":1334,"path":1335,"stem":1336,"children":1337,"icon":1339},"Choose a Temporal backend","\u002Ffleet\u002Ftemporal-backends","07.fleet\u002F16.temporal-backends\u002F00.index",[1338,1340,1344,1348],{"title":1334,"path":1335,"stem":1336,"icon":1339},"i-ph-cloud",{"title":1341,"path":1342,"stem":1343},"Set retention and move tenants","\u002Ffleet\u002Ftemporal-backends\u002Fretention-and-migration","07.fleet\u002F16.temporal-backends\u002F01.retention-and-migration",{"title":1345,"path":1346,"stem":1347},"Encrypt Temporal payloads","\u002Ffleet\u002Ftemporal-backends\u002Fencryption","07.fleet\u002F16.temporal-backends\u002F02.encryption",{"title":1349,"path":1350,"stem":1351},"Read payloads in Temporal UI","\u002Ffleet\u002Ftemporal-backends\u002Fcodec","07.fleet\u002F16.temporal-backends\u002F03.codec",{"title":1353,"path":1354,"stem":1355,"icon":1356},"Regions","\u002Ffleet\u002Fregions","07.fleet\u002F17.regions","i-ph-globe-hemisphere-east",{"title":1358,"path":1359,"stem":1360,"children":1361,"icon":1363},"Run the roles separately","\u002Ffleet\u002Fseparate-roles","07.fleet\u002F18.separate-roles\u002F00.index",[1362,1364,1368,1372,1376],{"title":1358,"path":1359,"stem":1360,"icon":1363},"i-ph-squares-four",{"title":1365,"path":1366,"stem":1367},"Prepare database rights","\u002Ffleet\u002Fseparate-roles\u002Fdatabase-rights","07.fleet\u002F18.separate-roles\u002F01.database-rights",{"title":1369,"path":1370,"stem":1371},"Keep plaintext secrets on edges","\u002Ffleet\u002Fseparate-roles\u002Fsecrets","07.fleet\u002F18.separate-roles\u002F02.secrets",{"title":1373,"path":1374,"stem":1375},"Operate through role outages","\u002Ffleet\u002Fseparate-roles\u002Foutages","07.fleet\u002F18.separate-roles\u002F03.outages",{"title":1377,"path":1378,"stem":1379},"Use Temporal UI with separate roles","\u002Ffleet\u002Fseparate-roles\u002Ftemporal-ui","07.fleet\u002F18.separate-roles\u002F04.temporal-ui",{"title":1381,"path":1382,"stem":1383,"icon":1384},"High availability","\u002Ffleet\u002Fhigh-availability","07.fleet\u002F19.high-availability","i-ph-copy",{"title":1386,"path":1387,"stem":1388,"icon":1389},"Management over a WAN","\u002Ffleet\u002Fmanagement-over-a-wan","07.fleet\u002F20.management-over-a-wan","i-ph-globe-hemisphere-west",{"title":1391,"path":1392,"stem":1393,"icon":1394},"Cloud federation","\u002Ffleet\u002Fcloud-federation","07.fleet\u002F21.cloud-federation","i-ph-cloud-check",{"title":1396,"path":1397,"stem":1398,"icon":451},"Payload storage","\u002Ffleet\u002Fpayload-storage","07.fleet\u002F22.payload-storage",{"title":1400,"path":1401,"stem":1402,"children":1403,"icon":1405},"Upgrade a cluster","\u002Ffleet\u002Fupgrades","07.fleet\u002F23.upgrades\u002F00.index",[1404,1406,1410,1414,1418,1422,1426,1430,1434,1438,1442,1446,1450,1454],{"title":1400,"path":1401,"stem":1402,"icon":1405},"i-ph-arrows-clockwise",{"title":1407,"path":1408,"stem":1409},"Prepare for sandbox changes","\u002Ffleet\u002Fupgrades\u002Fsandbox-changes","07.fleet\u002F23.upgrades\u002F01.sandbox-changes",{"title":1411,"path":1412,"stem":1413},"Review policy changes","\u002Ffleet\u002Fupgrades\u002Fpolicy-changes","07.fleet\u002F23.upgrades\u002F02.policy-changes",{"title":1415,"path":1416,"stem":1417},"Review data and privacy migrations","\u002Ffleet\u002Fupgrades\u002Fdata-migrations","07.fleet\u002F23.upgrades\u002F03.data-migrations",{"title":1419,"path":1420,"stem":1421},"Prepare storage and identity migrations","\u002Ffleet\u002Fupgrades\u002Fstorage-and-identity","07.fleet\u002F23.upgrades\u002F04.storage-and-identity",{"title":1423,"path":1424,"stem":1425},"Prepare plugins for an upgrade","\u002Ffleet\u002Fupgrades\u002Fplugin-changes","07.fleet\u002F23.upgrades\u002F05.plugin-changes",{"title":1427,"path":1428,"stem":1429},"Keep calls compatible during upgrades","\u002Ffleet\u002Fupgrades\u002Fcall-compatibility","07.fleet\u002F23.upgrades\u002F06.call-compatibility",{"title":1431,"path":1432,"stem":1433},"Review model and budget migrations","\u002Ffleet\u002Fupgrades\u002Fmodel-and-budget-changes","07.fleet\u002F23.upgrades\u002F07.model-and-budget-changes",{"title":1435,"path":1436,"stem":1437},"Migrate to shared worker pools","\u002Ffleet\u002Fupgrades\u002Fshared-pools","07.fleet\u002F23.upgrades\u002F08.shared-pools",{"title":1439,"path":1440,"stem":1441},"Upgrade node binaries and runtimes","\u002Ffleet\u002Fupgrades\u002Fnodes","07.fleet\u002F23.upgrades\u002F09.nodes",{"title":1443,"path":1444,"stem":1445},"Understand runtime shutdown","\u002Ffleet\u002Fupgrades\u002Fruntime-shutdown","07.fleet\u002F23.upgrades\u002F10.runtime-shutdown",{"title":1447,"path":1448,"stem":1449},"Review runtime behaviour changes","\u002Ffleet\u002Fupgrades\u002Fruntime-changes","07.fleet\u002F23.upgrades\u002F11.runtime-changes",{"title":1451,"path":1452,"stem":1453},"Verify releases and switch channels","\u002Ffleet\u002Fupgrades\u002Frelease-verification","07.fleet\u002F23.upgrades\u002F12.release-verification",{"title":1455,"path":1456,"stem":1457},"Roll a runtime out in steps","\u002Ffleet\u002Fupgrades\u002Fruntime-rollouts","07.fleet\u002F23.upgrades\u002F13.runtime-rollouts",{"title":1459,"path":1460,"stem":1461,"icon":463},"Releases","\u002Ffleet\u002Freleases","07.fleet\u002F24.releases",{"title":1463,"path":1464,"stem":1465,"icon":1466},"Docker","\u002Ffleet\u002Fdocker","07.fleet\u002F25.docker","i-ph-shipping-container",{"title":1468,"path":1469,"stem":1470,"children":1471,"icon":480},"Deploy with Kubernetes","\u002Ffleet\u002Fkubernetes","07.fleet\u002F26.kubernetes\u002F00.index",[1472,1473,1477],{"title":1468,"path":1469,"stem":1470,"icon":480},{"title":1474,"path":1475,"stem":1476,"icon":480},"Helm objects and values","\u002Ffleet\u002Fkubernetes\u002Fvalues","07.fleet\u002F26.kubernetes\u002F01.values",{"title":1478,"path":1479,"stem":1480,"icon":480},"Maintain a Kubernetes deployment","\u002Ffleet\u002Fkubernetes\u002Fmaintenance","07.fleet\u002F26.kubernetes\u002F02.maintenance",{"title":1482,"path":1483,"stem":1484,"icon":1485},"Offline install","\u002Ffleet\u002Foffline-install","07.fleet\u002F27.offline-install","i-ph-airplane-tilt",{"title":1487,"path":1488,"stem":1489,"icon":98},"FIPS builds","\u002Ffleet\u002Ffips","07.fleet\u002F28.fips",{"title":1491,"path":1492,"stem":1493,"icon":249},"Run Orchestrator Zero from an MCP client","\u002Ffleet\u002Fmcp-client","07.fleet\u002F29.mcp-client",{"title":1495,"path":1496,"stem":1497,"children":1498,"icon":451},"Back up a cluster","\u002Ffleet\u002Fbackups","07.fleet\u002F30.backups\u002F00.index",[1499,1500],{"title":1495,"path":1496,"stem":1497,"icon":451},{"title":1501,"path":1502,"stem":1503},"Restore a cluster","\u002Ffleet\u002Fbackups\u002Frestore","07.fleet\u002F30.backups\u002F01.restore",{"title":1505,"path":1506,"stem":1507,"children":1508,"icon":71},"Spend","\u002Fspend","08.spend\u002F00.index",[1509,1511,1533,1547,1585],{"title":1510,"path":1506,"stem":1507},"Manage model access and spending",{"title":1512,"path":1513,"stem":1514,"children":1515,"icon":552},"Read cost and usage","\u002Fspend\u002Fcost-and-usage","08.spend\u002F01.cost-and-usage\u002F00.index",[1516,1517,1521,1525,1529],{"title":1512,"path":1513,"stem":1514,"icon":552},{"title":1518,"path":1519,"stem":1520},"Understand recorded charges","\u002Fspend\u002Fcost-and-usage\u002Faccounting","08.spend\u002F01.cost-and-usage\u002F01.accounting",{"title":1522,"path":1523,"stem":1524},"Read model call timings","\u002Fspend\u002Fcost-and-usage\u002Ftimings","08.spend\u002F01.cost-and-usage\u002F02.timings",{"title":1526,"path":1527,"stem":1528},"Export usage","\u002Fspend\u002Fcost-and-usage\u002Fexports","08.spend\u002F01.cost-and-usage\u002F03.exports",{"title":1530,"path":1531,"stem":1532},"Explain prices and cache costs","\u002Fspend\u002Fcost-and-usage\u002Fprices-and-cache","08.spend\u002F01.cost-and-usage\u002F04.prices-and-cache",{"title":1534,"path":1535,"stem":1536,"children":1537,"icon":134},"Set budgets and quotas","\u002Fspend\u002Fbudgets-and-quotas","08.spend\u002F02.budgets-and-quotas\u002F00.index",[1538,1539,1543],{"title":1534,"path":1535,"stem":1536,"icon":134},{"title":1540,"path":1541,"stem":1542,"icon":134},"Understand quota charging and refusals","\u002Fspend\u002Fbudgets-and-quotas\u002Fcharging","08.spend\u002F02.budgets-and-quotas\u002F01.charging",{"title":1544,"path":1545,"stem":1546,"icon":134},"Request and review budget","\u002Fspend\u002Fbudgets-and-quotas\u002Frequests","08.spend\u002F02.budgets-and-quotas\u002F02.requests",{"title":1548,"path":1549,"stem":1550,"children":1551,"icon":416},"Connect a model provider","\u002Fspend\u002Fmodels-and-keys","08.spend\u002F03.models-and-keys\u002F00.index",[1552,1553,1557,1561,1565,1569,1573,1577,1581],{"title":1548,"path":1549,"stem":1550,"icon":416},{"title":1554,"path":1555,"stem":1556},"Choose model aliases","\u002Fspend\u002Fmodels-and-keys\u002Faliases","08.spend\u002F03.models-and-keys\u002F01.aliases",{"title":1558,"path":1559,"stem":1560},"Map a plugin's models","\u002Fspend\u002Fmodels-and-keys\u002Fmapping","08.spend\u002F03.models-and-keys\u002F02.mapping",{"title":1562,"path":1563,"stem":1564},"Set reasoning effort and cascades","\u002Fspend\u002Fmodels-and-keys\u002Feffort-and-cascades","08.spend\u002F03.models-and-keys\u002F03.effort-and-cascades",{"title":1566,"path":1567,"stem":1568},"Authenticate model calls","\u002Fspend\u002Fmodels-and-keys\u002Fauthentication","08.spend\u002F03.models-and-keys\u002F04.authentication",{"title":1570,"path":1571,"stem":1572},"Control what model calls can reach","\u002Fspend\u002Fmodels-and-keys\u002Fdata-rules","08.spend\u002F03.models-and-keys\u002F05.data-rules",{"title":1574,"path":1575,"stem":1576},"Pool model deployments","\u002Fspend\u002Fmodels-and-keys\u002Fdeployment-pools","08.spend\u002F03.models-and-keys\u002F06.deployment-pools",{"title":1578,"path":1579,"stem":1580},"Configure caches and server tools","\u002Fspend\u002Fmodels-and-keys\u002Fcache-and-tools","08.spend\u002F03.models-and-keys\u002F07.cache-and-tools",{"title":1582,"path":1583,"stem":1584},"Check model changes and retirement","\u002Fspend\u002Fmodels-and-keys\u002Fcanaries-and-retirement","08.spend\u002F03.models-and-keys\u002F08.canaries-and-retirement",{"title":1586,"path":1587,"stem":1588,"icon":1589},"Translating providers","\u002Fspend\u002Ftranslating-providers","08.spend\u002F04.translating-providers","i-ph-translate",{"title":1591,"path":1592,"stem":1593,"children":1594,"icon":71},"Admin","\u002Fadmin","09.admin\u002F00.index",[1595,1597,1623,1650,1654,1658,1680,1685,1696],{"title":1596,"path":1592,"stem":1593},"Administer access and credentials",{"title":1598,"path":1599,"stem":1600,"children":1601,"icon":98},"Configure sign-in","\u002Fadmin\u002Fsign-in","09.admin\u002F01.sign-in\u002F00.index",[1602,1603,1607,1611,1615,1619],{"title":1598,"path":1599,"stem":1600,"icon":98},{"title":1604,"path":1605,"stem":1606},"Configure an identity provider","\u002Fadmin\u002Fsign-in\u002Fidentity-providers","09.admin\u002F01.sign-in\u002F01.identity-providers",{"title":1608,"path":1609,"stem":1610},"Provision accounts from a directory","\u002Fadmin\u002Fsign-in\u002Fprovisioning","09.admin\u002F01.sign-in\u002F02.provisioning",{"title":1612,"path":1613,"stem":1614},"Manage passwords and second factors","\u002Fadmin\u002Fsign-in\u002Fpasswords","09.admin\u002F01.sign-in\u002F03.passwords",{"title":1616,"path":1617,"stem":1618},"Sign in from the CLI and MCP clients","\u002Fadmin\u002Fsign-in\u002Fclients","09.admin\u002F01.sign-in\u002F04.clients",{"title":1620,"path":1621,"stem":1622},"End sessions and inspect sign-in events","\u002Fadmin\u002Fsign-in\u002Fsessions","09.admin\u002F01.sign-in\u002F05.sessions",{"title":1624,"path":1625,"stem":1626,"children":1627,"icon":1629},"Manage tenant secrets","\u002Fadmin\u002Fsecrets","09.admin\u002F02.secrets\u002F00.index",[1628,1630,1634,1638,1642,1646],{"title":1624,"path":1625,"stem":1626,"icon":1629},"i-ph-key",{"title":1631,"path":1632,"stem":1633},"Bind secrets to destination hosts","\u002Fadmin\u002Fsecrets\u002Fhost-bindings","09.admin\u002F02.secrets\u002F01.host-bindings",{"title":1635,"path":1636,"stem":1637},"Test and rotate secrets","\u002Fadmin\u002Fsecrets\u002Frotation","09.admin\u002F02.secrets\u002F02.rotation",{"title":1639,"path":1640,"stem":1641},"Use an external secret store","\u002Fadmin\u002Fsecrets\u002Fexternal-stores","09.admin\u002F02.secrets\u002F03.external-stores",{"title":1643,"path":1644,"stem":1645},"Deliver and scan plugin secrets","\u002Fadmin\u002Fsecrets\u002Fplugin-secrets","09.admin\u002F02.secrets\u002F04.plugin-secrets",{"title":1647,"path":1648,"stem":1649},"Configure plugin settings","\u002Fadmin\u002Fsecrets\u002Fsettings","09.admin\u002F02.secrets\u002F05.settings",{"title":1651,"path":1652,"stem":1653,"icon":1629},"Credential injection","\u002Fadmin\u002Fcredential-injection","09.admin\u002F03.credential-injection",{"title":1655,"path":1656,"stem":1657,"icon":1629},"Key commands","\u002Fadmin\u002Fkey-commands","09.admin\u002F04.key-commands",{"title":1659,"path":1660,"stem":1661,"children":1662,"icon":782},"Connect a plugin to another system","\u002Fadmin\u002Fconnections","09.admin\u002F05.connections\u002F00.index",[1663,1664,1668,1672,1676],{"title":1659,"path":1660,"stem":1661,"icon":782},{"title":1665,"path":1666,"stem":1667,"icon":782},"Renew and reconnect credentials","\u002Fadmin\u002Fconnections\u002Frenewal","09.admin\u002F05.connections\u002F01.renewal",{"title":1669,"path":1670,"stem":1671,"icon":782},"Restrict connection destinations","\u002Fadmin\u002Fconnections\u002Fdestinations","09.admin\u002F05.connections\u002F02.destinations",{"title":1673,"path":1674,"stem":1675,"icon":782},"Diagnose connection failures","\u002Fadmin\u002Fconnections\u002Ftroubleshooting","09.admin\u002F05.connections\u002F03.troubleshooting",{"title":1677,"path":1678,"stem":1679,"icon":782},"Understand connection security","\u002Fadmin\u002Fconnections\u002Fsecurity","09.admin\u002F05.connections\u002F04.security",{"title":1681,"path":1682,"stem":1683,"icon":1684},"Tenants","\u002Fadmin\u002Ftenants","09.admin\u002F06.tenants","i-ph-buildings",{"title":1686,"path":1687,"stem":1688,"children":1689,"icon":1691},"Export and verify a tenant","\u002Fadmin\u002Ftenant-export","09.admin\u002F07.tenant-export\u002F00.index",[1690,1692],{"title":1686,"path":1687,"stem":1688,"icon":1691},"i-ph-export",{"title":1693,"path":1694,"stem":1695,"icon":1691},"Tenant export format","\u002Fadmin\u002Ftenant-export\u002Fformat","09.admin\u002F07.tenant-export\u002F01.format",{"title":1697,"path":1698,"stem":1699,"icon":1700},"Notifications","\u002Fadmin\u002Fnotifications","09.admin\u002F08.notifications","i-ph-bell-ringing",{"title":1702,"path":1703,"stem":1704,"children":1705,"icon":71},"Reference","\u002Freference","10.reference\u002F00.index",[1706,1707,1726,1760,1794,1798,1803,1807,1812,1817,1822,1826],{"title":1702,"path":1703,"stem":1704},{"title":1708,"path":1709,"stem":1710,"children":1711,"icon":1725},"CLI","\u002Freference\u002Fcli","10.reference\u002F01.cli\u002F00.index",[1712,1713,1719],{"title":1708,"path":1709,"stem":1710},{"title":1714,"path":1715,"stem":1716,"children":1717},"oz0","\u002Freference\u002Fcli\u002Foz0","10.reference\u002F01.cli\u002F01.oz0\u002F00.index",[1718],{"title":1714,"path":1715,"stem":1716},{"title":1720,"path":1721,"stem":1722,"children":1723},"oz0-node","\u002Freference\u002Fcli\u002Foz0-node","10.reference\u002F01.cli\u002F02.oz0-node\u002F00.index",[1724],{"title":1720,"path":1721,"stem":1722},"i-ph-terminal-window",{"title":1727,"path":1728,"stem":1729,"children":1730,"icon":725},"oz0-plugin.yaml","\u002Freference\u002Fplugin-manifest","10.reference\u002F02.plugin-manifest\u002F00.index",[1731,1732,1736,1740,1744,1748,1752,1756],{"title":1727,"path":1728,"stem":1729,"icon":725},{"title":1733,"path":1734,"stem":1735},"Dependencies and cross-plugin access","\u002Freference\u002Fplugin-manifest\u002Fdependencies","10.reference\u002F02.plugin-manifest\u002F01.dependencies",{"title":1737,"path":1738,"stem":1739},"Tool declarations","\u002Freference\u002Fplugin-manifest\u002Ftools","10.reference\u002F02.plugin-manifest\u002F02.tools",{"title":1741,"path":1742,"stem":1743},"Harnesses, events and channels","\u002Freference\u002Fplugin-manifest\u002Fruntimes","10.reference\u002F02.plugin-manifest\u002F03.runtimes",{"title":1745,"path":1746,"stem":1747},"Connections and hooks","\u002Freference\u002Fplugin-manifest\u002Fconnections","10.reference\u002F02.plugin-manifest\u002F04.connections",{"title":1749,"path":1750,"stem":1751},"Plugin sets and policies","\u002Freference\u002Fplugin-manifest\u002Fsets-policy","10.reference\u002F02.plugin-manifest\u002F05.sets-policy",{"title":1753,"path":1754,"stem":1755},"Data, evidence and mail","\u002Freference\u002Fplugin-manifest\u002Fdata","10.reference\u002F02.plugin-manifest\u002F06.data",{"title":1757,"path":1758,"stem":1759},"Generated OpenAPI manifests","\u002Freference\u002Fplugin-manifest\u002Fopenapi","10.reference\u002F02.plugin-manifest\u002F07.openapi",{"title":1761,"path":1762,"stem":1763,"children":1764,"icon":666},"Agent definition","\u002Freference\u002Fagent-definition","10.reference\u002F03.agent-definition\u002F00.index",[1765,1766,1770,1774,1778,1782,1786,1790],{"title":1761,"path":1762,"stem":1763,"icon":666},{"title":1767,"path":1768,"stem":1769},"Identity, instructions and tools","\u002Freference\u002Fagent-definition\u002Fidentity","10.reference\u002F03.agent-definition\u002F01.identity",{"title":1771,"path":1772,"stem":1773},"Models and placement","\u002Freference\u002Fagent-definition\u002Fmodels","10.reference\u002F03.agent-definition\u002F02.models",{"title":1775,"path":1776,"stem":1777},"Limits and spend","\u002Freference\u002Fagent-definition\u002Flimits","10.reference\u002F03.agent-definition\u002F03.limits",{"title":1779,"path":1780,"stem":1781},"Judges and candidate selection","\u002Freference\u002Fagent-definition\u002Fquality","10.reference\u002F03.agent-definition\u002F04.quality",{"title":1783,"path":1784,"stem":1785},"Delegation and human decisions","\u002Freference\u002Fagent-definition\u002Fcoordination","10.reference\u002F03.agent-definition\u002F05.coordination",{"title":1787,"path":1788,"stem":1789},"History and recovery","\u002Freference\u002Fagent-definition\u002Fhistory","10.reference\u002F03.agent-definition\u002F06.history",{"title":1791,"path":1792,"stem":1793},"Sandbox, data and retention","\u002Freference\u002Fagent-definition\u002Fsecurity","10.reference\u002F03.agent-definition\u002F07.security",{"title":1795,"path":1796,"stem":1797,"icon":517},"Ports","\u002Freference\u002Fports","10.reference\u002F04.ports",{"title":1799,"path":1800,"stem":1801,"icon":1802},"Environment variables","\u002Freference\u002Fenvironment","10.reference\u002F05.environment","i-ph-brackets-curly",{"title":1804,"path":1805,"stem":1806,"icon":373},"Files and directories","\u002Freference\u002Ffiles","10.reference\u002F06.files",{"title":1808,"path":1809,"stem":1810,"icon":1811},"Lists and pages","\u002Freference\u002Flist-pages","10.reference\u002F07.list-pages","i-ph-list-numbers",{"title":1813,"path":1814,"stem":1815,"icon":1816},"Spend refusals","\u002Freference\u002Fspend-refusals","10.reference\u002F08.spend-refusals","i-ph-hand-coins",{"title":1818,"path":1819,"stem":1820,"icon":1821},"Admin API","\u002Freference\u002Fadmin-api","10.reference\u002F09.admin-api","i-ph-repeat",{"title":1823,"path":1824,"stem":1825},"Compatibility","\u002Freference\u002Fcompatibility","10.reference\u002F10.compatibility",{"title":1827,"path":1828,"stem":1829},"Known issues","\u002Freference\u002Fknown-issues","10.reference\u002F11.known-issues",{"title":1831,"path":1832,"stem":1833,"children":1834,"icon":71},"About","\u002Fabout","11.about\u002F00.index",[1835,1836,1840,1845],{"title":1831,"path":1832,"stem":1833},{"title":1837,"path":1838,"stem":1839,"icon":967},"Licensing","\u002Fabout\u002Flicensing","11.about\u002F01.licensing",{"title":1841,"path":1842,"stem":1843,"icon":1844},"About these docs","\u002Fabout\u002Fcontributing-docs","11.about\u002F02.contributing-docs","i-ph-pencil-simple",{"title":1846,"path":1847,"stem":1848,"icon":42},"A local environment","\u002Fabout\u002Flocal-environment","11.about\u002F03.local-environment",{"id":1850,"title":829,"body":1851,"description":3426,"extension":3427,"links":3428,"meta":3429,"navigation":3432,"path":830,"seo":3433,"stem":831,"__hash__":3434},"docs\u002F04.build\u002F02.parts\u002F16.routines\u002F00.index.md",{"type":1852,"value":1853,"toc":3413},"minimark",[1854,1858,1861,1891,1903,2413,2466,2480,2487,2491,2497,2502,2512,2644,2654,2683,2690,2708,2712,2744,2782,2810,2839,2857,2863,2867,2874,2961,2996,3014,3018,3073,3080,3084,3213,3227,3231,3234,3248,3251,3255,3310,3314,3328,3346,3359,3363,3370,3376,3409],[1855,1856,1857],"p",{},"For: plugin authors.",[1855,1859,1860],{},"Define a routine to run an agent or flow from a Temporal Schedule, a signed webhook or a manual start. Its definition binds the target to its triggers, allowed tools, queued safe outputs and limits. Each run follows these rules:",[1862,1863,1864,1873,1876,1879],"ul",{},[1865,1866,1867,1868,1872],"li",{},"runs as the routine's own service identity, ",[1869,1870,1871],"code",{},"service:\u003Cname>",", never as the person who wrote it;",[1865,1874,1875],{},"calls only the tools the routine lists;",[1865,1877,1878],{},"gets the trigger's payload as labelled data after its task, never mixed into its instructions;",[1865,1880,1881,1882,1885,1886,1890],{},"can queue changes as safe outputs: the edge checks them, waits for a person where the routine says so, and applies them with credentials only the edge holds. Outputs run after the fire by default; ",[1869,1883,1884],{},"apply: now"," applies one during the fire. A routine can also call declared write tools when it has no shell access (",[1887,1888,1889],"a",{"href":837},"Tools and safe outputs",").",[1855,1892,1893,1894,1898,1899,1902],{},"A routine can also run a plugin's evals on a schedule instead of an agent: an ",[1887,1895,1897],{"href":1896},"\u002Fimprove\u002Fevals\u002Fregressions#scheduled-evals","eval routine"," (",[1869,1900,1901],{},"eval: {plugin: ...}","), which the edge fires itself, with required budgets, and whose runs are compared case by case to find a regression.",[1904,1905,1911],"pre",{"className":1906,"code":1907,"filename":1908,"language":1909,"meta":1910,"style":1910},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","name: triage\ndescription: Labels new issues\nagent: acme-triager            # or flow: \u003Cname>\ninput: Label the issue in the trigger data.\nowner_team: support\nrun_as: triage-bot             # fires run as service:triage-bot; the routine's name when left out\ntriggers:\n  - name: nightly\n    schedule: { cron: \"0 3 * * *\", timezone: Europe\u002FStockholm, jitter: 5m }\n    input: Look at yesterday's unlabelled issues.\n  - name: github\n    webhook:\n      secret: GITHUB_WEBHOOK\n      filter: trigger.body.action == 'opened'\n      sender: trigger.body.sender.login\n      allow_senders: [kevin, ada]\ntools: [acme_github.read_issue]     # none unless listed\nnetwork: [api.github.com]      # what the node's egress proxy may let through; none unless listed\noutputs:\n  - name: add_labels\n    description: Add labels to the issue\n    schema:\n      type: object\n      properties: { labels: { type: array, items: { type: string } } }\n      required: [labels]\n    allow: { labels: [bug, question, feature] }\n    http: { url: \"https:\u002F\u002Fhooks.example.com\u002Flabels\", secret: LABELS_HOOK }\nlimits:\n  budget_usd: 0.50             # per fire\n  daily_budget_usd: 5\n  stop_after: 2026-12-31\n","triage.yaml","yaml","",[1869,1912,1913,1930,1941,1956,1967,1978,1992,2001,2015,2064,2075,2087,2095,2106,2117,2128,2150,2169,2187,2195,2207,2218,2226,2237,2285,2300,2333,2367,2375,2390,2401],{"__ignoreMap":1910},[1914,1915,1918,1922,1926],"span",{"class":1916,"line":1917},"line",1,[1914,1919,1921],{"class":1920},"swJcz","name",[1914,1923,1925],{"class":1924},"sMK4o",":",[1914,1927,1929],{"class":1928},"sfazB"," triage\n",[1914,1931,1933,1936,1938],{"class":1916,"line":1932},2,[1914,1934,1935],{"class":1920},"description",[1914,1937,1925],{"class":1924},[1914,1939,1940],{"class":1928}," Labels new issues\n",[1914,1942,1944,1947,1949,1952],{"class":1916,"line":1943},3,[1914,1945,1946],{"class":1920},"agent",[1914,1948,1925],{"class":1924},[1914,1950,1951],{"class":1928}," acme-triager",[1914,1953,1955],{"class":1954},"sHwdD","            # or flow: \u003Cname>\n",[1914,1957,1959,1962,1964],{"class":1916,"line":1958},4,[1914,1960,1961],{"class":1920},"input",[1914,1963,1925],{"class":1924},[1914,1965,1966],{"class":1928}," Label the issue in the trigger data.\n",[1914,1968,1970,1973,1975],{"class":1916,"line":1969},5,[1914,1971,1972],{"class":1920},"owner_team",[1914,1974,1925],{"class":1924},[1914,1976,1977],{"class":1928}," support\n",[1914,1979,1981,1984,1986,1989],{"class":1916,"line":1980},6,[1914,1982,1983],{"class":1920},"run_as",[1914,1985,1925],{"class":1924},[1914,1987,1988],{"class":1928}," triage-bot",[1914,1990,1991],{"class":1954},"             # fires run as service:triage-bot; the routine's name when left out\n",[1914,1993,1995,1998],{"class":1916,"line":1994},7,[1914,1996,1997],{"class":1920},"triggers",[1914,1999,2000],{"class":1924},":\n",[1914,2002,2004,2007,2010,2012],{"class":1916,"line":2003},8,[1914,2005,2006],{"class":1924},"  -",[1914,2008,2009],{"class":1920}," name",[1914,2011,1925],{"class":1924},[1914,2013,2014],{"class":1928}," nightly\n",[1914,2016,2018,2021,2023,2026,2029,2031,2034,2037,2040,2043,2046,2048,2051,2053,2056,2058,2061],{"class":1916,"line":2017},9,[1914,2019,2020],{"class":1920},"    schedule",[1914,2022,1925],{"class":1924},[1914,2024,2025],{"class":1924}," {",[1914,2027,2028],{"class":1920}," cron",[1914,2030,1925],{"class":1924},[1914,2032,2033],{"class":1924}," \"",[1914,2035,2036],{"class":1928},"0 3 * * *",[1914,2038,2039],{"class":1924},"\"",[1914,2041,2042],{"class":1924},",",[1914,2044,2045],{"class":1920}," timezone",[1914,2047,1925],{"class":1924},[1914,2049,2050],{"class":1928}," Europe\u002FStockholm",[1914,2052,2042],{"class":1924},[1914,2054,2055],{"class":1920}," jitter",[1914,2057,1925],{"class":1924},[1914,2059,2060],{"class":1928}," 5m",[1914,2062,2063],{"class":1924}," }\n",[1914,2065,2067,2070,2072],{"class":1916,"line":2066},10,[1914,2068,2069],{"class":1920},"    input",[1914,2071,1925],{"class":1924},[1914,2073,2074],{"class":1928}," Look at yesterday's unlabelled issues.\n",[1914,2076,2078,2080,2082,2084],{"class":1916,"line":2077},11,[1914,2079,2006],{"class":1924},[1914,2081,2009],{"class":1920},[1914,2083,1925],{"class":1924},[1914,2085,2086],{"class":1928}," github\n",[1914,2088,2090,2093],{"class":1916,"line":2089},12,[1914,2091,2092],{"class":1920},"    webhook",[1914,2094,2000],{"class":1924},[1914,2096,2098,2101,2103],{"class":1916,"line":2097},13,[1914,2099,2100],{"class":1920},"      secret",[1914,2102,1925],{"class":1924},[1914,2104,2105],{"class":1928}," GITHUB_WEBHOOK\n",[1914,2107,2109,2112,2114],{"class":1916,"line":2108},14,[1914,2110,2111],{"class":1920},"      filter",[1914,2113,1925],{"class":1924},[1914,2115,2116],{"class":1928}," trigger.body.action == 'opened'\n",[1914,2118,2120,2123,2125],{"class":1916,"line":2119},15,[1914,2121,2122],{"class":1920},"      sender",[1914,2124,1925],{"class":1924},[1914,2126,2127],{"class":1928}," trigger.body.sender.login\n",[1914,2129,2131,2134,2136,2139,2142,2144,2147],{"class":1916,"line":2130},16,[1914,2132,2133],{"class":1920},"      allow_senders",[1914,2135,1925],{"class":1924},[1914,2137,2138],{"class":1924}," [",[1914,2140,2141],{"class":1928},"kevin",[1914,2143,2042],{"class":1924},[1914,2145,2146],{"class":1928}," ada",[1914,2148,2149],{"class":1924},"]\n",[1914,2151,2153,2156,2158,2160,2163,2166],{"class":1916,"line":2152},17,[1914,2154,2155],{"class":1920},"tools",[1914,2157,1925],{"class":1924},[1914,2159,2138],{"class":1924},[1914,2161,2162],{"class":1928},"acme_github.read_issue",[1914,2164,2165],{"class":1924},"]",[1914,2167,2168],{"class":1954},"     # none unless listed\n",[1914,2170,2172,2175,2177,2179,2182,2184],{"class":1916,"line":2171},18,[1914,2173,2174],{"class":1920},"network",[1914,2176,1925],{"class":1924},[1914,2178,2138],{"class":1924},[1914,2180,2181],{"class":1928},"api.github.com",[1914,2183,2165],{"class":1924},[1914,2185,2186],{"class":1954},"      # what the node's egress proxy may let through; none unless listed\n",[1914,2188,2190,2193],{"class":1916,"line":2189},19,[1914,2191,2192],{"class":1920},"outputs",[1914,2194,2000],{"class":1924},[1914,2196,2198,2200,2202,2204],{"class":1916,"line":2197},20,[1914,2199,2006],{"class":1924},[1914,2201,2009],{"class":1920},[1914,2203,1925],{"class":1924},[1914,2205,2206],{"class":1928}," add_labels\n",[1914,2208,2210,2213,2215],{"class":1916,"line":2209},21,[1914,2211,2212],{"class":1920},"    description",[1914,2214,1925],{"class":1924},[1914,2216,2217],{"class":1928}," Add labels to the issue\n",[1914,2219,2221,2224],{"class":1916,"line":2220},22,[1914,2222,2223],{"class":1920},"    schema",[1914,2225,2000],{"class":1924},[1914,2227,2229,2232,2234],{"class":1916,"line":2228},23,[1914,2230,2231],{"class":1920},"      type",[1914,2233,1925],{"class":1924},[1914,2235,2236],{"class":1928}," object\n",[1914,2238,2240,2243,2245,2247,2250,2252,2254,2257,2259,2262,2264,2267,2269,2271,2273,2275,2278,2281,2283],{"class":1916,"line":2239},24,[1914,2241,2242],{"class":1920},"      properties",[1914,2244,1925],{"class":1924},[1914,2246,2025],{"class":1924},[1914,2248,2249],{"class":1920}," labels",[1914,2251,1925],{"class":1924},[1914,2253,2025],{"class":1924},[1914,2255,2256],{"class":1920}," type",[1914,2258,1925],{"class":1924},[1914,2260,2261],{"class":1928}," array",[1914,2263,2042],{"class":1924},[1914,2265,2266],{"class":1920}," items",[1914,2268,1925],{"class":1924},[1914,2270,2025],{"class":1924},[1914,2272,2256],{"class":1920},[1914,2274,1925],{"class":1924},[1914,2276,2277],{"class":1928}," string",[1914,2279,2280],{"class":1924}," }",[1914,2282,2280],{"class":1924},[1914,2284,2063],{"class":1924},[1914,2286,2288,2291,2293,2295,2298],{"class":1916,"line":2287},25,[1914,2289,2290],{"class":1920},"      required",[1914,2292,1925],{"class":1924},[1914,2294,2138],{"class":1924},[1914,2296,2297],{"class":1928},"labels",[1914,2299,2149],{"class":1924},[1914,2301,2303,2306,2308,2310,2312,2314,2316,2319,2321,2324,2326,2329,2331],{"class":1916,"line":2302},26,[1914,2304,2305],{"class":1920},"    allow",[1914,2307,1925],{"class":1924},[1914,2309,2025],{"class":1924},[1914,2311,2249],{"class":1920},[1914,2313,1925],{"class":1924},[1914,2315,2138],{"class":1924},[1914,2317,2318],{"class":1928},"bug",[1914,2320,2042],{"class":1924},[1914,2322,2323],{"class":1928}," question",[1914,2325,2042],{"class":1924},[1914,2327,2328],{"class":1928}," feature",[1914,2330,2165],{"class":1924},[1914,2332,2063],{"class":1924},[1914,2334,2336,2339,2341,2343,2346,2348,2350,2353,2355,2357,2360,2362,2365],{"class":1916,"line":2335},27,[1914,2337,2338],{"class":1920},"    http",[1914,2340,1925],{"class":1924},[1914,2342,2025],{"class":1924},[1914,2344,2345],{"class":1920}," url",[1914,2347,1925],{"class":1924},[1914,2349,2033],{"class":1924},[1914,2351,2352],{"class":1928},"https:\u002F\u002Fhooks.example.com\u002Flabels",[1914,2354,2039],{"class":1924},[1914,2356,2042],{"class":1924},[1914,2358,2359],{"class":1920}," secret",[1914,2361,1925],{"class":1924},[1914,2363,2364],{"class":1928}," LABELS_HOOK",[1914,2366,2063],{"class":1924},[1914,2368,2370,2373],{"class":1916,"line":2369},28,[1914,2371,2372],{"class":1920},"limits",[1914,2374,2000],{"class":1924},[1914,2376,2378,2381,2383,2387],{"class":1916,"line":2377},29,[1914,2379,2380],{"class":1920},"  budget_usd",[1914,2382,1925],{"class":1924},[1914,2384,2386],{"class":2385},"sbssI"," 0.50",[1914,2388,2389],{"class":1954},"             # per fire\n",[1914,2391,2393,2396,2398],{"class":1916,"line":2392},30,[1914,2394,2395],{"class":1920},"  daily_budget_usd",[1914,2397,1925],{"class":1924},[1914,2399,2400],{"class":2385}," 5\n",[1914,2402,2404,2407,2409],{"class":1916,"line":2403},31,[1914,2405,2406],{"class":1920},"  stop_after",[1914,2408,1925],{"class":1924},[1914,2410,2412],{"class":2411},"sTEyZ"," 2026-12-31\n",[1904,2414,2419],{"className":2415,"code":2416,"filename":2417,"language":2418,"meta":1910,"style":1910},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","oz0 routine check -f triage.yaml   # what is wrong, without saving\noz0 routine save -f triage.yaml    # version 1; the edge fires it within seconds\noz0 routine list\n","Terminal","bash",[1869,2420,2421,2441,2457],{"__ignoreMap":1910},[1914,2422,2423,2426,2429,2432,2435,2438],{"class":1916,"line":1917},[1914,2424,1714],{"class":2425},"sBMFI",[1914,2427,2428],{"class":1928}," routine",[1914,2430,2431],{"class":1928}," check",[1914,2433,2434],{"class":1928}," -f",[1914,2436,2437],{"class":1928}," triage.yaml",[1914,2439,2440],{"class":1954},"   # what is wrong, without saving\n",[1914,2442,2443,2445,2447,2450,2452,2454],{"class":1916,"line":1932},[1914,2444,1714],{"class":2425},[1914,2446,2428],{"class":1928},[1914,2448,2449],{"class":1928}," save",[1914,2451,2434],{"class":1928},[1914,2453,2437],{"class":1928},[1914,2455,2456],{"class":1954},"    # version 1; the edge fires it within seconds\n",[1914,2458,2459,2461,2463],{"class":1916,"line":1943},[1914,2460,1714],{"class":2425},[1914,2462,2428],{"class":1928},[1914,2464,2465],{"class":1928}," list\n",[1855,2467,2468,2471,2472,2475,2476,2479],{},[1869,2469,2470],{},"routine check"," and ",[1869,2473,2474],{},"routine save"," say what the tenant lacks for the routine. Whether a secret it names is set, and how that secret is bound, they say only to someone who may read the tenant's secrets (",[1869,2477,2478],{},"secrets.read","); to anyone else they say what each secret must be, the same whether it is set or not, and the edge checks it at every fire and post.",[1855,2481,2482,2483,2486],{},"Every save is an immutable version with a hash; saving the same definition again makes no new version. A fire records the routine version it ran; like any job, it stays on the runtime version it started on, and on one plugin version for its whole run, also during a plugin rollout. ",[1869,2484,2485],{},"routine rollback \u003Cname> \u003Cversion>"," saves an older version's definition as the next one. Tenant admins save and delete routines; operators run, pause and resume them; readers see them.",[2488,2489,2490],"h2",{"id":1997},"Triggers",[1855,2492,2493,2494,2496],{},"A routine has at most 64 triggers and 64 outputs. See ",[1887,2495,2372],{"href":130},".",[2498,2499,2501],"h3",{"id":2500},"schedules","Schedules",[1855,2503,2504,2505,2511],{},"Each schedule trigger is a ",[1887,2506,2510],{"href":2507,"rel":2508},"https:\u002F\u002Fdocs.temporal.io\u002Fschedule",[2509],"nofollow","Temporal Schedule"," that the edge creates, changes and removes with the routine. The schedule lives in Temporal, so a routine keeps firing while management is down.",[2513,2514,2515,2531],"table",{},[2516,2517,2518],"thead",{},[2519,2520,2521,2525,2528],"tr",{},[2522,2523,2524],"th",{},"Field",[2522,2526,2527],{},"Meaning",[2522,2529,2530],{},"Default",[2532,2533,2534,2563,2582,2595,2628],"tbody",{},[2519,2535,2536,2546,2560],{},[2537,2538,2539,2542,2543],"td",{},[1869,2540,2541],{},"cron"," or ",[1869,2544,2545],{},"every",[2537,2547,2548,2549,2542,2552,2555,2556,2559],{},"A five-field cron expression, or an interval such as ",[1869,2550,2551],{},"15m",[1869,2553,2554],{},"24h"," (at least ",[1869,2557,2558],{},"1m",")",[2537,2561,2562],{},"one of them is required",[2519,2564,2565,2570,2579],{},[2537,2566,2567],{},[1869,2568,2569],{},"timezone",[2537,2571,2572,2573,2575,2576],{},"An IANA zone for ",[1869,2574,2541],{},", such as ",[1869,2577,2578],{},"Europe\u002FStockholm",[2537,2580,2581],{},"UTC",[2519,2583,2584,2589,2592],{},[2537,2585,2586],{},[1869,2587,2588],{},"jitter",[2537,2590,2591],{},"Each fire waits a random time up to this long, so many routines do not fire at once",[2537,2593,2594],{},"none",[2519,2596,2597,2602,2624],{},[2537,2598,2599],{},[1869,2600,2601],{},"overlap",[2537,2603,2604,2605,2608,2609,2608,2612,2608,2615,2608,2618,2542,2621],{},"When a fire is due while the last one runs: ",[1869,2606,2607],{},"skip",", ",[1869,2610,2611],{},"buffer_one",[1869,2613,2614],{},"buffer_all",[1869,2616,2617],{},"cancel_other",[1869,2619,2620],{},"terminate_other",[1869,2622,2623],{},"allow_all",[2537,2625,2626],{},[1869,2627,2607],{},[2519,2629,2630,2635,2638],{},[2537,2631,2632],{},[1869,2633,2634],{},"catchup_window",[2537,2636,2637],{},"After an outage, fires missed within this window still run",[2537,2639,2640,2643],{},[1869,2641,2642],{},"1h",", rather than Temporal's year",[1855,2645,2646,2649,2650,2653],{},[1869,2647,2648],{},"oz0 routine fires \u003Cname>"," (which takes ",[1869,2651,2652],{},"jobs.read",", since fires are jobs) shows each schedule's next fire, how often it has fired and whether it is paused, and why. To run the fires of a past period, for example after a pause:",[1904,2655,2657],{"className":2415,"code":2656,"filename":2417,"language":2418,"meta":1910,"style":1910},"oz0 routine backfill triage --from 6h --overlap buffer_all\n",[1869,2658,2659],{"__ignoreMap":1910},[1914,2660,2661,2663,2665,2668,2671,2674,2677,2680],{"class":1916,"line":1917},[1914,2662,1714],{"class":2425},[1914,2664,2428],{"class":1928},[1914,2666,2667],{"class":1928}," backfill",[1914,2669,2670],{"class":1928}," triage",[1914,2672,2673],{"class":1928}," --from",[1914,2675,2676],{"class":1928}," 6h",[1914,2678,2679],{"class":1928}," --overlap",[1914,2681,2682],{"class":1928}," buffer_all\n",[1855,2684,2685,2686,2689],{},"A backfill keeps to the routine's limits. Temporal runs backfills even while a schedule is paused, so the edge checks eligibility first. It refuses a routine that is paused or stopped, has no installed agent, is stopped by a ",[1887,2687,2688],{"href":1117},"kill switch",", has a retired agent, or belongs to a tenant whose region move is draining from this edge's region.",[1855,2691,2692,2693,2696,2697,2700,2701,2704,2705,2707],{},"One backfill starts at most ",[1869,2694,2695],{},"limits.max_fires_per_hour"," fires. Their possible spend, at up to ",[1869,2698,2699],{},"budget_usd"," each, must fit in ",[1869,2702,2703],{},"daily_budget_usd"," together with today's spending and what running fires may still spend. Because backfill fires are all due at once, ",[1869,2706,2623],{}," is refused.",[2498,2709,2711],{"id":2710},"webhooks","Webhooks",[1855,2713,2714,2715,2718,2719,2722,2723,2726,2727,2731,2732,2735,2736,2739,2740,2743],{},"A webhook trigger fires on ",[1869,2716,2717],{},"POST \u002Fhooks\u002F\u003Ctenant>\u002F\u003Croutine>"," on the edge's HTTPS port, or ",[1869,2720,2721],{},"\u002Fhooks\u002F\u003Ctenant>\u002F\u003Croutine>\u002F\u003Ctrigger>"," when the routine has several. The caller proves it knows the tenant secret named in ",[1869,2724,2725],{},"secret",", as for ",[1887,2728,2730],{"href":2729},"\u002Fbuild\u002Fparts\u002Fflows#start-one-from-a-webhook","flows' webhooks",": ",[1869,2733,2734],{},"Authorization: Bearer \u003Csecret>",", or an HMAC-SHA256 signature of the body as ",[1869,2737,2738],{},"X-Hub-Signature-256"," (GitHub's header) or ",[1869,2741,2742],{},"X-Oz0-Signature",". Then, before anything costs money:",[2745,2746,2747,2754,2772],"ol",{},[1865,2748,2749,2750,2753],{},"the body may be at most ",[1869,2751,2752],{},"max_body_kb"," (1024 unless set), and must be JSON;",[1865,2755,2756,2759,2760,2764,2765,2471,2768,2771],{},[1869,2757,2758],{},"filter",", a ",[1887,2761,2763],{"href":2762},"\u002Fbuild\u002Fparts\u002Fflows\u002Fsteps-and-expressions#expressions","CEL"," expression over ",[1869,2766,2767],{},"trigger.body",[1869,2769,2770],{},"trigger.headers"," of at most 1,024 bytes, must be true;",[1865,2773,2774,2775,2471,2778,2781],{},"with ",[1869,2776,2777],{},"sender",[1869,2779,2780],{},"allow_senders",", the sender the expression names must be in the list.",[1855,2783,2784,2785,2788,2789,2792,2793,2796,2797,2800,2801,2608,2804,2542,2807,1890],{},"A delivery that the filter or the allowlist rules out answers ",[1869,2786,2787],{},"200"," with ",[1869,2790,2791],{},"{\"fired\": \"false\", \"reason\": \"...\"}",". A fire answers ",[1869,2794,2795],{},"202"," with its job ID. What the sender signed names the job, ",[1869,2798,2799],{},"rt.\u003Croutine>.\u003Ctrigger>.\u003Cdelivery>",": with a signature, the SHA-256 of what it covers, so the same signed body sent again never runs twice, whatever its delivery headers say; with a bearer secret, which is the secret itself, the delivery header (",[1869,2802,2803],{},"Idempotency-Key",[1869,2805,2806],{},"X-GitHub-Delivery",[1869,2808,2809],{},"X-Request-Id",[1855,2811,2812,2813,2471,2816,2819,2820,2823,2824,2827,2828,2830,2831,2834,2835,2838],{},"A sender that sends the same body again on purpose signs a timestamp with it: ",[1869,2814,2815],{},"X-Oz0-Timestamp: \u003CUnix seconds>",[1869,2817,2818],{},"X-Oz0-Signature: sha256=\u003Chex HMAC-SHA256 of \"\u003Ctimestamp>.\u003Cbody>\">","; a timestamp more than five minutes from the edge's clock is refused (",[1869,2821,2822],{},"401","). A paused routine, or one past its daily budget or its fires per hour, answers ",[1869,2825,2826],{},"429",". While a ",[1887,2829,2688],{"href":1117}," stops its agent or flow, a delivery gets ",[1869,2832,2833],{},"503"," with the switch's reason (",[1869,2836,2837],{},"oz0_killed","), as a flow's webhook does.",[1855,2840,2841,2842,2844,2845,2848,2849,2852,2853,2856],{},"A routine whose webhook secret is not set yet refuses every delivery with the ",[1869,2843,2822],{}," a wrong signature gets (the edge's log says which it was), so the answer tells nobody which secrets the tenant has. The secret is a signing key bound by name to the edge's address senders post to, with its port (",[1869,2846,2847],{},"oz0 secret set GITHUB_WEBHOOK --signing --host oz0-edge.acme.example:7443","): the edge API's advertised address, its ",[1869,2850,2851],{},"--public-edge-url"," or a ",[1869,2854,2855],{},"--san"," name at the edge API's port, which the operator sets, never the host a request names.",[1855,2858,2859,2860,2862],{},"Any other secret, a credential such as a database's password above all, a key that signs what goes to another host or one bound by a wildcard, checks nothing and gets the same ",[1869,2861,2822],{},", so whoever may write a routine cannot name another secret as its webhook's and test guesses of it.",[2498,2864,2866],{"id":2865},"events","Events",[1855,2868,2869,2870,2873],{},"An event trigger fires on the events of an ",[1887,2871,2872],{"href":763},"event source",", which a plugin declares, such as GitHub's pull requests:",[1904,2875,2877],{"className":1906,"code":2876,"language":1909,"meta":1910,"style":1910},"triggers:\n  - name: pr-opened\n    event:\n      source: github-events\n      types: [pull_request]\n      filter: event.action == 'opened'\n      sender: event.attributes.sender\n      allow_senders: [kevin, ada]\n",[1869,2878,2879,2885,2896,2903,2913,2927,2936,2945],{"__ignoreMap":1910},[1914,2880,2881,2883],{"class":1916,"line":1917},[1914,2882,1997],{"class":1920},[1914,2884,2000],{"class":1924},[1914,2886,2887,2889,2891,2893],{"class":1916,"line":1932},[1914,2888,2006],{"class":1924},[1914,2890,2009],{"class":1920},[1914,2892,1925],{"class":1924},[1914,2894,2895],{"class":1928}," pr-opened\n",[1914,2897,2898,2901],{"class":1916,"line":1943},[1914,2899,2900],{"class":1920},"    event",[1914,2902,2000],{"class":1924},[1914,2904,2905,2908,2910],{"class":1916,"line":1958},[1914,2906,2907],{"class":1920},"      source",[1914,2909,1925],{"class":1924},[1914,2911,2912],{"class":1928}," github-events\n",[1914,2914,2915,2918,2920,2922,2925],{"class":1916,"line":1969},[1914,2916,2917],{"class":1920},"      types",[1914,2919,1925],{"class":1924},[1914,2921,2138],{"class":1924},[1914,2923,2924],{"class":1928},"pull_request",[1914,2926,2149],{"class":1924},[1914,2928,2929,2931,2933],{"class":1916,"line":1980},[1914,2930,2111],{"class":1920},[1914,2932,1925],{"class":1924},[1914,2934,2935],{"class":1928}," event.action == 'opened'\n",[1914,2937,2938,2940,2942],{"class":1916,"line":1994},[1914,2939,2122],{"class":1920},[1914,2941,1925],{"class":1924},[1914,2943,2944],{"class":1928}," event.attributes.sender\n",[1914,2946,2947,2949,2951,2953,2955,2957,2959],{"class":1916,"line":2003},[1914,2948,2133],{"class":1920},[1914,2950,1925],{"class":1924},[1914,2952,2138],{"class":1924},[1914,2954,2141],{"class":1928},[1914,2956,2042],{"class":1924},[1914,2958,2146],{"class":1928},[1914,2960,2149],{"class":1924},[1855,2962,2963,2471,2965,2967,2968,2971,2972,2608,2975,2608,2978,2608,2981,2471,2984,2987,2988,2992,2993,2995],{},[1869,2964,2758],{},[1869,2966,2777],{}," are CEL over ",[1869,2969,2970],{},"event"," (its ",[1869,2973,2974],{},"type",[1869,2976,2977],{},"action",[1869,2979,2980],{},"subject",[1869,2982,2983],{},"attributes",[1869,2985,2986],{},"text","), and read only what the edge verified of it against the delivery: the type, action, subject and attributes its source ",[1887,2989,2991],{"href":2990},"\u002Fbuild\u002Fparts\u002Fevent-sources\u002Fdelivery-binding#bind-events-to-the-delivery","binds",", and the text. A trigger that reads a field its source does not bind does not fire, so ",[1869,2994,2780],{}," holds only over a sender the source binds.",[1855,2997,2998,2999,3002,3003,3005,3006,3009,3010,3013],{},"A fire's job is ",[1869,3000,3001],{},"rt.\u003Croutine>.\u003Ctrigger>.\u003Cevent id>",", so a delivery sent again fires once, and event fires count toward ",[1869,3004,2695],{}," as webhook fires do. The fire's agent may ",[1887,3007,3008],{"href":238},"wait for further events",", such as CI on the pull request, when the routine lists ",[1869,3011,3012],{},"oz.wait_for_event"," in its tools.",[2498,3015,3017],{"id":3016},"run-now-and-dry-runs","Run now and dry runs",[1904,3019,3021],{"className":2415,"code":3020,"filename":2417,"language":2418,"meta":1910,"style":1910},"oz0 routine run triage --payload '{\"action\": \"opened\", \"issue\": 7}' --wait\noz0 routine run triage --dry-run --payload '{\"action\": \"opened\", \"issue\": 8}' --wait\n",[1869,3022,3023,3049],{"__ignoreMap":1910},[1914,3024,3025,3027,3029,3032,3034,3037,3040,3043,3046],{"class":1916,"line":1917},[1914,3026,1714],{"class":2425},[1914,3028,2428],{"class":1928},[1914,3030,3031],{"class":1928}," run",[1914,3033,2670],{"class":1928},[1914,3035,3036],{"class":1928}," --payload",[1914,3038,3039],{"class":1924}," '",[1914,3041,3042],{"class":1928},"{\"action\": \"opened\", \"issue\": 7}",[1914,3044,3045],{"class":1924},"'",[1914,3047,3048],{"class":1928}," --wait\n",[1914,3050,3051,3053,3055,3057,3059,3062,3064,3066,3069,3071],{"class":1916,"line":1932},[1914,3052,1714],{"class":2425},[1914,3054,2428],{"class":1928},[1914,3056,3031],{"class":1928},[1914,3058,2670],{"class":1928},[1914,3060,3061],{"class":1928}," --dry-run",[1914,3063,3036],{"class":1928},[1914,3065,3039],{"class":1924},[1914,3067,3068],{"class":1928},"{\"action\": \"opened\", \"issue\": 8}",[1914,3070,3045],{"class":1924},[1914,3072,3048],{"class":1928},[1855,3074,3075,3076,3079],{},"A fire someone starts runs as the routine's identity too; the log and the audit record who asked. A dry run takes the same path as any fire, and its outputs are checked and recorded as ",[1869,3077,3078],{},"dry_run",", never applied.",[2488,3081,3083],{"id":3082},"safe-defaults","Safe defaults",[2513,3085,3086,3095],{},[2516,3087,3088],{},[2519,3089,3090,3093],{},[2522,3091,3092],{},"What",[2522,3094,2530],{},[2532,3096,3097,3105,3112,3123,3134,3150,3161,3176,3190,3198],{},[2519,3098,3099,3102],{},[2537,3100,3101],{},"Tools",[2537,3103,3104],{},"none unless listed",[2519,3106,3107,3110],{},[2537,3108,3109],{},"Network",[2537,3111,3104],{},[2519,3113,3114,3117],{},[2537,3115,3116],{},"Outputs",[2537,3118,3119,3120],{},"wait for a person unless ",[1869,3121,3122],{},"approval: false",[2519,3124,3125,3128],{},[2537,3126,3127],{},"Budget per fire",[2537,3129,3130,3131,2559],{},"$1 (",[1869,3132,3133],{},"limits.budget_usd",[2519,3135,3136,3139],{},[2537,3137,3138],{},"Budget per routine per UTC day",[2537,3140,3141,3142,3145,3146,3149],{},"$10 (",[1869,3143,3144],{},"limits.daily_budget_usd","; ",[1869,3147,3148],{},"0"," for no cap)",[2519,3151,3152,3155],{},[2537,3153,3154],{},"Webhook, event and manual fires",[2537,3156,3157,3158,3160],{},"60 per hour (",[1869,3159,2695],{},"), however many arrive at once: each takes one of the hour's places before it starts",[2519,3162,3163,3166],{},[2537,3164,3165],{},"Repeated failures",[2537,3167,3168,3169,3145,3172,3175],{},"paused after 3 failed fires in a row (",[1869,3170,3171],{},"limits.pause_after_failures",[1869,3173,3174],{},"-1"," for never), with the reason shown",[2519,3177,3178,3181],{},[2537,3179,3180],{},"Stop date",[2537,3182,3183,3184,2542,3187,2559],{},"90 days after the last save or resume, so saving or resuming renews it (",[1869,3185,3186],{},"limits.stop_after: YYYY-MM-DD",[1869,3188,3189],{},"never",[2519,3191,3192,3195],{},[2537,3193,3194],{},"Missed schedule fires",[2537,3196,3197],{},"made up within 1 hour",[2519,3199,3200,3203],{},[2537,3201,3202],{},"Time per fire",[2537,3204,3205,3206,2575,3209,3212],{},"the agent's own limits only (",[1869,3207,3208],{},"limits.timeout",[1869,3210,3211],{},"30m",", ends a fire that runs longer)",[1855,3214,3215,3216,3218,3219,3222,3223,3226],{},"A spent daily budget pauses the routine's schedules until midnight UTC; its webhooks answer ",[1869,3217,2826],{}," until then. A routine that pauses itself shows who paused it (",[1869,3220,3221],{},"system",") and why; ",[1869,3224,3225],{},"routine resume"," starts it again, and only failures after that count towards the next pause.",[2488,3228,3230],{"id":3229},"in-the-console","In the console",[1855,3232,3233],{},"Routines, under Build, lists each routine with what it runs, its triggers and outputs, its team, what it spent today and whether it is paused. A routine's page has:",[1862,3235,3236,3239,3242,3245],{},[1865,3237,3238],{},"Definition: the YAML in a text editor that the server checks as you type, against the tenant's agents, tools and secrets; save makes the next version.",[1865,3240,3241],{},"Test run: a payload and a dry run, with the outputs the fire would make and the answer.",[1865,3243,3244],{},"Fires: its schedules with their next fire, and every fire with its trigger, version and status.",[1865,3246,3247],{},"Outputs and Versions, and Run now, Pause and Delete.",[1855,3249,3250],{},"A fire's job page has an Outputs tab, and its approval appears with the others.",[2488,3252,3254],{"id":3253},"from-your-own-app","From your own app",[1855,3256,3257,3258,2608,3261,2471,3264,3267,3268,2608,3271,2608,3274,2608,3277,2471,3279,3281,3282,2608,3285,2608,3288,2608,3291,2608,3294,2471,3297,3300,3301,2608,3304,2471,3307,2496],{},"The runtime API has ",[1869,3259,3260],{},"FireRoutine",[1869,3262,3263],{},"ListRoutineFires",[1869,3265,3266],{},"BackfillRoutine","; a job has ",[1869,3269,3270],{},"routine",[1869,3272,3273],{},"routine_version",[1869,3275,3276],{},"trigger",[1869,3278,3078],{},[1869,3280,2192],{},". The admin API has ",[1869,3283,3284],{},"ListRoutines",[1869,3286,3287],{},"GetRoutine",[1869,3289,3290],{},"CheckRoutine",[1869,3292,3293],{},"SaveRoutine",[1869,3295,3296],{},"DeleteRoutine",[1869,3298,3299],{},"SetRoutinePaused",". In Temporal, every fire carries the search attributes ",[1869,3302,3303],{},"Oz0Routine",[1869,3305,3306],{},"Oz0RoutineVersion",[1869,3308,3309],{},"Oz0Trigger",[2488,3311,3313],{"id":3312},"routines-a-plugin-ships","Routines a plugin ships",[1855,3315,3316,3317,3320,3321,3324,3325,3327],{},"No manifest key installs a routine: a routine runs as its own identity, owned by one of the tenant's teams, with the tools and limits an admin chose, so an admin saves it. A plugin that has routines to offer ships them as files in a ",[1869,3318,3319],{},"routines\u002F"," folder, which its docs page lists and an admin saves with ",[1869,3322,3323],{},"oz0 routine save -f \u003Cfile>",", after setting its ",[1869,3326,1972],{}," and, for a schedule, its input.",[1855,3329,3330,3332,3333,3335,3336,2608,3339,3342,3343,3345],{},[1887,3331,618],{"href":619}," ships one per ticket system; the ",[1887,3334,627],{"href":628}," ships one each for GitHub's CI events, the platform's results events, a weekly schedule and a closed pull request. Each lists only the read-only functions its flow calls, and the last one the two platform built-ins its flow calls without a model (",[1869,3337,3338],{},"oz.report_outcome",[1869,3340,3341],{},"oz.propose_update","): none reaches a coding session, so its fires never hold a shell and a write. A routine lists a built-in its flow's steps call as it lists a function (",[1869,3344,3341],{},"); a fire calls only what it lists.",[3347,3348,3349,3350,3354,3355,3358],"note",{},"Not yet: routines a plugin installs itself (its templates are files an admin saves), a preflight step before a webhook fire, and safe outputs from harness agents. A webhook routine reaches a harness agent with a shell or write tools only when a node of the tenant with ",[1887,3351,3353],{"href":3352},"\u002Fconcepts\u002Fsecurity\u002Fsandbox-tiers#sandboxes","sandbox tier 1"," can run that agent: saving it is refused otherwise, as ",[1869,3356,3357],{},"plugin install"," refuses such a webhook flow.",[2488,3360,3362],{"id":3361},"related-tasks","Related tasks",[1862,3364,3365],{},[1865,3366,3367,3369],{},[1887,3368,836],{"href":837},": Review what a run may read and the changes it may queue.",[1855,3371,3372],{},[1914,3373,3375],{"id":3374},"in-the-web-ui","Section on this page",[3377,3378,3379],"legacy-sections",{},[1862,3380,3381,3391,3400],{},[1865,3382,3383,2731,3387],{},[1914,3384,3386],{"id":3385},"outputs-applied-during-a-fire","Section",[1887,3388,3390],{"href":3389},"\u002Fbuild\u002Fparts\u002Froutines\u002Foutputs-and-permissions#outputs-applied-during-a-fire","outputs applied during a fire",[1865,3392,3393,2731,3396],{},[1914,3394,3386],{"id":3395},"safe-outputs",[1887,3397,3399],{"href":3398},"\u002Fbuild\u002Fparts\u002Froutines\u002Foutputs-and-permissions#safe-outputs","safe outputs",[1865,3401,3402,2731,3405],{},[1914,3403,3386],{"id":3404},"what-a-fire-may-do",[1887,3406,3408],{"href":3407},"\u002Fbuild\u002Fparts\u002Froutines\u002Foutputs-and-permissions#what-a-fire-may-do","what a fire may do",[3410,3411,3412],"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 pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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":1910,"searchDepth":1932,"depth":1932,"links":3414},[3415,3421,3422,3423,3424,3425],{"id":1997,"depth":1932,"text":2490,"children":3416},[3417,3418,3419,3420],{"id":2500,"depth":1943,"text":2501},{"id":2710,"depth":1943,"text":2711},{"id":2865,"depth":1943,"text":2866},{"id":3016,"depth":1943,"text":3017},{"id":3082,"depth":1932,"text":3083},{"id":3229,"depth":1932,"text":3230},{"id":3253,"depth":1932,"text":3254},{"id":3312,"depth":1932,"text":3313},{"id":3361,"depth":1932,"text":3362},"Bind a scheduled or event-driven job to an identity, tools and limits.","md",null,{"audience":3430,"doc_type":3431},"plugin authors","how-to",{"icon":834},{"title":829,"description":3426},"fEll9fXU6O8Z50FtXkQ-YVqh6pKWQ12_SMhDZwcGiDg",[3436,3438],{"title":824,"path":825,"stem":826,"description":3437,"icon":827,"children":-1},"Every part has one address, \u003Cplugin>\u002F\u003Cpart>. Where you write one, how the server checks it against the part's owner, and why a part is never renamed in place.",{"title":836,"path":837,"stem":838,"description":3439,"icon":834,"children":-1},"Review what a run may read and the changes it may queue.",1794442931722]