[{"data":1,"prerenderedAt":3836},["ShallowReactive",2],{"navigation_docs":3,"docs-page:\u002Fbuild\u002Fplugins\u002Fstructure\u002Flint-rules":1849,"docs-surround:\u002Fbuild\u002Fplugins\u002Fstructure\u002Flint-rules":3831},[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":375,"body":1851,"description":1860,"extension":3823,"links":3824,"meta":3825,"navigation":3828,"path":376,"seo":3829,"stem":377,"__hash__":3830},"docs\u002F04.build\u002F01.plugins\u002F06.structure\u002F01.lint-rules.md",{"type":1852,"value":1853,"toc":3796},"minimark",[1854,1858,1861,1866,1869,1930,1956,1970,2007,2014,2022,2101,2121,2125,2130,2151,2157,2173,2177,2184,2187,2197,2201,2218,2228,2231,2234,2243,2281,2284,2288,2305,2312,2332,2336,2346,2353,2360,2364,2394,2397,2400,2404,2412,2415,2436,2440,2445,2448,2458,2462,2465,2468,2479,2483,2494,2497,2500,2504,2521,2532,2535,2542,2545,2551,2728,2731,2734,2737,2741,2744,2751,2754,2757,2763,2793,2796,2809,2812,2839,2869,2880,2883,2886,2905,3150,3154,3161,3183,3186,3223,3226,3257,3261,3264,3282,3290,3338,3342,3355,3362,3367,3411,3419,3423,3426,3436,3442,3483,3486,3490,3493,3496,3521,3532,3537,3576,3582,3586,3592,3603,3610,3663,3666,3669,3734,3751,3754,3786,3792],[1855,1856,1857],"p",{},"For: plugin authors.",[1855,1859,1860],{},"Look up the verified plugin house rules enforced by lint.",[1862,1863,1865],"h2",{"id":1864},"the-house-rules","The house rules",[1855,1867,1868],{},"Verified plugins keep these rules, and the build kit teaches them to coding agents:",[1870,1871,1872,1887,1890,1898,1901,1904,1907,1910,1913,1927],"ul",{},[1873,1874,1875,1876,1881,1882,1886],"li",{},"every function says whether it writes, and the plugin's ",[1877,1878,1880],"a",{"href":1879},"\u002Fbuild\u002Fplugins\u002Fstructure#a-suggested-policy","suggested policy"," asks a person about\neach write by default, a default the installer may switch; ",[1883,1884,1885],"code",{},"requires_approval"," only for calls a person must decide\nevery time;",[1873,1888,1889],{},"a connection, never a pasted secret;",[1873,1891,1892,1893,1897],{},"exact egress hosts, with the vendor's EU regional host where it has one, and a host that serves files anyone can\npublish only when the plugin must download from it (",[1877,1894,1896],{"href":1895},"\u002Fbuild\u002Fplugins\u002Fstructure\u002Flint-rules#oz-s022","OZ-S022",");",[1873,1899,1900],{},"writes that are safe to repeat (an idempotency key);",[1873,1902,1903],{},"the AI label on everything sent to people;",[1873,1905,1906],{},"output schemas, so results become cards;",[1873,1908,1909],{},"evals for agents that replay offline, and contract tests with fakes for connectors;",[1873,1911,1912],{},"about 20 to 30 functions per agent before lazy tools;",[1873,1914,1915,1916,1919,1920,1919,1923,1926],{},"agents ask for the tenant's aliases (",[1883,1917,1918],{},"default",", ",[1883,1921,1922],{},"fast",[1883,1924,1925],{},"smart","), never a vendor's model without a reason;",[1873,1928,1929],{},"the naming above, and the kind.",[1855,1931,1932,1933,1936,1937,1940,1941,1944,1945,1919,1948,1951,1952,1955],{},"Every plugin, verified or not, also keeps its README and its licence within the checks on\n",[1877,1934,1935],{"href":642},"Plugin limits",": its ",[1883,1938,1939],{},"README.md"," is its documentation on the hub's page, within the limits it\nshows, and a licence file holds the licence ",[1883,1942,1943],{},"license:"," declares. Those are the loader's checks, with codes of their own\nrather than rule IDs, and ",[1883,1946,1947],{},"plugin lint",[1883,1949,1950],{},"plugin pack"," and ",[1883,1953,1954],{},"hub submit"," fail on them.",[1855,1957,1958,1960,1961,1965,1966,1969],{},[1883,1959,1947],{}," checks the rules it can see, each with its ID. They are warnings for every plugin, except\n",[1877,1962,1964],{"href":1963},"\u002Fbuild\u002Fplugins\u002Fstructure\u002Flint-rules#oz-s012","OZ-S012",", which is an error. ",[1883,1967,1968],{},"plugin lint --verified"," lints at the level verified plugins are held to:\nevery warning is an error there, and the rules only verified plugins must pass run too. The project's tests lint\nevery first-party plugin this way, with a freshly measured listing. Installs never refuse a plugin over a house rule.",[1855,1971,1972,1973,1976,1977,1980,1981,1984,1985,1988,1989,1993,1994,1997,1998,2001,2002,2006],{},"Some rules read the plugin's measured tool listing (",[1883,1974,1975],{},"tools.listing.json",", which ",[1883,1978,1979],{},"oz0 plugin test"," or\n",[1883,1982,1983],{},"oz0 plugin pack --list-tools"," writes): the functions' annotations and output schemas are in the listing, not in the\nmanifest. Without one, lint says once that those rules could not run: a note, and an error with ",[1883,1986,1987],{},"--verified",", which\nalso fails a listing that leaves a tool out or was measured from other files (",[1877,1990,1992],{"href":1991},"\u002Fbuild\u002Fplugins\u002Fstructure\u002Flint-rules#oz-s014","OZ-S014","). A remote (",[1883,1995,1996],{},"url:",")\ntool has no measured listing, since no test node holds its connection's token: its committed snapshot,\n",[1883,1999,2000],{},"snapshots\u002F\u003Ctool>.json",", stands for it, with the manifest's overrides merged (",[1877,2003,2005],{"href":2004},"\u002Fbuild\u002Fplugins\u002Fstructure\u002Flint-rules#oz-s015","OZ-S015",").",[1855,2008,2009,2010,2013],{},"Lint cannot see whether a message carries the ",[1877,2011,2012],{"href":1113},"AI label",". A verified plugin proves it in a contract\ntest of each function that sends to people: the test calls the function against a fake of the system and checks that\nthe label is on what arrives.",[1855,2015,2016,2017,2021],{},"\"Verified\" means the project tested, pinned and secured the plugin. It never means that a system's vendor endorses\nit. See ",[1877,2018,2020],{"href":2019},"\u002Fbuild\u002Fplugins\u002Fverified#what-verified-means","what verified means",".",[2023,2024,2029],"pre",{"className":2025,"code":2026,"language":2027,"meta":2028,"style":2028},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","oz0 plugin test plugins\u002Fjira            # measures tools.listing.json and replays the evals\noz0 plugin lint --verified plugins\u002Fjira # every house rule as an error\noz0 plugin lint --json plugins\u002Fjira | jq '.problems[] | select(.code | startswith(\"OZ-S\"))'\n","bash","",[1883,2030,2031,2053,2071],{"__ignoreMap":2028},[2032,2033,2036,2039,2043,2046,2049],"span",{"class":2034,"line":2035},"line",1,[2032,2037,1714],{"class":2038},"sBMFI",[2032,2040,2042],{"class":2041},"sfazB"," plugin",[2032,2044,2045],{"class":2041}," test",[2032,2047,2048],{"class":2041}," plugins\u002Fjira",[2032,2050,2052],{"class":2051},"sHwdD","            # measures tools.listing.json and replays the evals\n",[2032,2054,2056,2058,2060,2063,2066,2068],{"class":2034,"line":2055},2,[2032,2057,1714],{"class":2038},[2032,2059,2042],{"class":2041},[2032,2061,2062],{"class":2041}," lint",[2032,2064,2065],{"class":2041}," --verified",[2032,2067,2048],{"class":2041},[2032,2069,2070],{"class":2051}," # every house rule as an error\n",[2032,2072,2074,2076,2078,2080,2083,2085,2089,2092,2095,2098],{"class":2034,"line":2073},3,[2032,2075,1714],{"class":2038},[2032,2077,2042],{"class":2041},[2032,2079,2062],{"class":2041},[2032,2081,2082],{"class":2041}," --json",[2032,2084,2048],{"class":2041},[2032,2086,2088],{"class":2087},"sMK4o"," |",[2032,2090,2091],{"class":2038}," jq",[2032,2093,2094],{"class":2087}," '",[2032,2096,2097],{"class":2041},".problems[] | select(.code | startswith(\"OZ-S\"))",[2032,2099,2100],{"class":2087},"'\n",[1855,2102,2103,2104,2107,2108,1919,2110,2113,2114,2117,2118,2120],{},"In ",[1883,2105,2106],{},"--json",", each finding has its rule ID as ",[1883,2109,1883],{},[1883,2111,2112],{},"warning",", and ",[1883,2115,2116],{},"strict: true"," when ",[1883,2119,1987],{}," makes it an\nerror.",[1862,2122,2124],{"id":2123},"the-rules","The rules",[2126,2127,2129],"h3",{"id":2128},"oz-s001","OZ-S001",[1855,2131,2132,2150],{},[2133,2134,2135,2136,1919,2139,2142,2143,2146,2147,2149],"strong",{},"The manifest says no kind, or one that is not ",[1883,2137,2138],{},"connector",[1883,2140,2141],{},"capability"," or ",[1883,2144,2145],{},"policy",", or ",[1883,2148,2145],{}," for a plugin\nthat is not one."," A warning. A policy is not one when it has no hooks, when it holds a connection, an event\nsource or a channel, which are an outside system's, or when its agents or flows reach hosts with secrets of the\nplugin's own, which is a capability's work. A policy's hooks may keep the credentials of a service they call, since\nhooks call only the plugin's own functions.",[1855,2152,2153,2154,2156],{},"Why: the kind says where agents, credentials and business logic belong, and three rules (OZ-S002, OZ-S003, OZ-S011)\ndepend on it. Without a kind they cannot run, and lint says which. None of them runs on a policy, so a connector or a\ncapability that only said ",[1883,2155,2145],{}," would pass them all. The connector's rules (OZ-S002, OZ-S011) also run on any\nplugin with a connection, an event source or a channel, whatever its kind says, and their findings say so.",[1855,2158,2159,2160,1919,2163,2142,2166,2169,2170,2172],{},"Fix: add ",[1883,2161,2162],{},"kind: connector",[1883,2164,2165],{},"kind: capability",[1883,2167,2168],{},"kind: policy"," to ",[1883,2171,1727],{},", the one the plugin is. Lint's\nfix says which the plugin looks like. A policy's connection, event source or channel moves into the system's\nconnector.",[2126,2174,2176],{"id":2175},"oz-s002","OZ-S002",[1855,2178,2179,2180,2183],{},"A connector carries business logic. A warning. It finds a connector with more than one agent, an agent that is\nnot a generic delegate (not tagged ",[1883,2181,2182],{},"delegate",", or calling another plugin's functions), or a flow of more than one step\nor one that calls something other than one of the connector's own functions.",[1855,2185,2186],{},"Why: business logic in a connector ties a job's changes to the system's tools. Every tenant that only needs the\nsystem gets the job too, and its rollout moves both.",[1855,2188,2189,2190,2193,2194,2196],{},"Fix: move the agents and flows that do a job into a capability that reaches the connector through ",[1883,2191,2192],{},"uses:",". Keep one\ndelegate, tagged ",[1883,2195,2182],{},", that calls only the connector's functions.",[2126,2198,2200],{"id":2199},"oz-s003","OZ-S003",[1855,2202,2203,2204,2207,2208,2211,2212,2142,2215,2021],{},"A capability holds credentials of its own. A warning. It finds a capability with a connection, a secret bound to\nhosts (",[1883,2205,2206],{},"requires.inject","), or, when the capability runs a server or a harness of its own, or has an agent with\n",[1883,2209,2210],{},"egress"," of its own (a harness session of the agent holds the plugin's secrets and may reach those hosts), a secret in\n",[1883,2213,2214],{},"requires.secrets",[1883,2216,2217],{},"requires.optional_secrets",[1855,2219,2220,2221,2224,2225,2021],{},"Leaving out ",[1883,2222,2223],{},"egress:"," does not exempt a secret: a process that receives it must still be trusted with it. Strict plugin sandboxing constrains network access on tier-1 nodes, but tier 0, explicit host-network modes and operator exemptions have different boundaries. See ",[1877,2226,2227],{"href":105},"plugin sandboxes",[1855,2229,2230],{},"A capability made only of flows over other plugins' functions hands no process a secret.",[1855,2232,2233],{},"Why: the system's credentials belong to its connector, where one connection, one set of approvals and one audit\ntrail cover every capability that uses it.",[1855,2235,2236,2237,2239,2240,2242],{},"Fix: reach the system through its connector, with its exact functions under ",[1883,2238,2192],{},". A system without a connector\ngets one: a plugin of kind ",[1883,2241,2138],{}," with the tools and the connection. A secret that is data, not a credential\n(such as names to look for that must not be readable as a setting), says so on a line of the manifest of its own, with\nthe reason, ten to 300 characters:",[2023,2244,2248],{"className":2245,"code":2246,"filename":1727,"language":2247,"meta":2028,"style":2028},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","requires:\n  # OZ-S003 allow PUBLIC_ACCESS_NAMES: names to look for in an export, matched in the plugin's own process; it reaches no host\n  optional_secrets: [PUBLIC_ACCESS_NAMES]\n","yaml",[1883,2249,2250,2259,2264],{"__ignoreMap":2028},[2032,2251,2252,2256],{"class":2034,"line":2035},[2032,2253,2255],{"class":2254},"swJcz","requires",[2032,2257,2258],{"class":2087},":\n",[2032,2260,2261],{"class":2034,"line":2055},[2032,2262,2263],{"class":2051},"  # OZ-S003 allow PUBLIC_ACCESS_NAMES: names to look for in an export, matched in the plugin's own process; it reaches no host\n",[2032,2265,2266,2269,2272,2275,2278],{"class":2034,"line":2073},[2032,2267,2268],{"class":2254},"  optional_secrets",[2032,2270,2271],{"class":2087},":",[2032,2273,2274],{"class":2087}," [",[2032,2276,2277],{"class":2041},"PUBLIC_ACCESS_NAMES",[2032,2279,2280],{"class":2087},"]\n",[1855,2282,2283],{},"Lint then reports nothing at the plain level, and at the verified level prints the reason as a warning it does not\nfail on, so whoever reviews a verified plugin reads it and checks that the plugin's servers send the secret nowhere.",[2126,2285,2287],{"id":2286},"oz-s004","OZ-S004",[1855,2289,2290,2291,2294,2295,2298,2299,2301,2302,2021],{},"A write function is neither marked nor behind approval. A warning. It reads the measured listing: a function that\nsays neither ",[1883,2292,2293],{},"readOnlyHint"," nor ",[1883,2296,2297],{},"destructiveHint",", and is not under ",[1883,2300,1885],{}," or the tool's ",[1883,2303,2304],{},"approval:",[1855,2306,2307,2308,2311],{},"Why: MCP reads a function without annotations as a destructive write. The tenant's\n",[1877,2309,2310],{"href":1049},"tool policy"," decides calls by these annotations, and cannot tell such a function from a read.",[1855,2313,2314,2315,2318,2319,2322,2323,2326,2327,2329,2330,2021],{},"Fix: give every function its annotations. A read says ",[1883,2316,2317],{},"readOnlyHint: true",". A write says ",[1883,2320,2321],{},"readOnlyHint: false",", and\n",[1883,2324,2325],{},"destructiveHint: true"," when it deletes or overwrites, which the default tool policy sends to a person. A write a\nperson should be asked about by default gets a rule in the plugin's ",[1877,2328,1880],{"href":1879}," that asks\n(a suggestion that asks counts as behind approval here). Only a call a person must decide every time goes under\n",[1883,2331,1885],{},[2126,2333,2335],{"id":2334},"oz-s005","OZ-S005",[1855,2337,2338,2339,2342,2343,2345],{},"Egress names a wildcard instead of exact hosts. A warning. It finds any ",[1883,2340,2341],{},"*"," in the manifest's ",[1883,2344,2210],{}," or an\nagent's.",[1855,2347,2348,2349,2352],{},"Why: a wildcard such as ",[1883,2350,2351],{},"*.example.com"," lets a tool reach every host under the domain, including ones its vendor\nlets customers create.",[1855,2354,2355,2356,2359],{},"Fix: name each host the plugin reaches, with the vendor's EU regional host where it has one. A host that differs per\ncustomer, such as a region or an account's own host, goes on the tenant's egress allowlist\n(",[1883,2357,2358],{},"oz0 tenant egress","), and the plugin's docs say which host to add.",[2126,2361,2363],{"id":2362},"oz-s006","OZ-S006",[1855,2365,2366,2367,2370,2371,1919,2374,1919,2377,1919,2380,1980,2383,2386,2387,2390,2391,2021],{},"The plugin's name is off the format. A warning. It finds a manifest name that carries a publisher (",[1883,2368,2369],{},"oz0-",", or a\nlabel of the hub listing's publisher), one that ends in ",[1883,2372,2373],{},"-plugin",[1883,2375,2376],{},"-connector",[1883,2378,2379],{},"-mcp",[1883,2381,2382],{},"-mcp-server",[1883,2384,2385],{},"-integration",", and a hub listing (",[1883,2388,2389],{},"hub\u002Flisting.yaml",") whose name is not ",[1883,2392,2393],{},"\u003Cpublisher>\u002F\u003Cmanifest name>",[1855,2395,2396],{},"Why: the hub adds the publisher, so a name that carries one says it twice, and a name that says what a plugin is\nrepeats the kind.",[1855,2398,2399],{},"Fix: name a connector for its system and a capability for its job, before you publish. A name already published\nstays as it is, since names are never reassigned.",[2126,2401,2403],{"id":2402},"oz-s007","OZ-S007",[1855,2405,2406,2407,2142,2409,2411],{},"A pasted secret for a system the plugin also has a connection for. A warning. It finds a secret in\n",[1883,2408,2214],{},[1883,2410,2217],{}," that one of the plugin's connections names, or that carries a\nconnection's prefix.",[1855,2413,2414],{},"Why: a pasted secret sits in the plugin's processes for as long as they run, while a connection gives each call only\nits own token, for its own function, and the edge can refresh or revoke it.",[1855,2416,2417,2418,2420,2421,2424,2425,2428,2429,2432,2433,2006],{},"Fix: take the secret out of ",[1883,2419,2255],{}," and let the connection give each call its token: name the functions under the\nconnection's ",[1883,2422,2423],{},"scopes",", and read the token from the call's ",[1883,2426,2427],{},"_meta"," under ",[1883,2430,2431],{},"oz0\u002Fconnections","\n(",[1877,2434,2435],{"href":778},"connections",[2126,2437,2439],{"id":2438},"oz-s008","OZ-S008",[1855,2441,2442,2443,2021],{},"A function has no output schema. Verified plugins only, from the measured listing; an error with ",[1883,2444,1987],{},[1855,2446,2447],{},"Why: OZ draws a function's results as cards from its output schema, and checks results against it.",[1855,2449,2450,2451,2454,2455,2021],{},"Fix: return structured content with an output schema. In the Python MCP SDK, a typed return value (a ",[1883,2452,2453],{},"TypedDict"," or\na model) becomes the function's ",[1883,2456,2457],{},"outputSchema",[2126,2459,2461],{"id":2460},"oz-s009","OZ-S009",[1855,2463,2464],{},"An agent lists more than 30 functions without lazy tools. A warning.",[1855,2466,2467],{},"Why: every function an agent lists is in every model request, which costs tokens and makes the model pick worse.",[1855,2469,2470,2471,2474,2475,2478],{},"Fix: set ",[1883,2472,2473],{},"tool_loading: lazy"," on the agent (",[1883,2476,2477],{},"plugin lint --fix"," does), so the model finds the functions it needs, or\nsplit the agent's work.",[2126,2480,2482],{"id":2481},"oz-s010","OZ-S010",[1855,2484,2485,2487,2488,2428,2491,2021],{},[1883,2486,2192],{}," grants a whole tool instead of exact functions. A warning. It finds ",[1883,2489,2490],{},"\u003Ctool>.*",[1883,2492,2493],{},"uses.\u003Cplugin>.tools",[1855,2495,2496],{},"Why: a whole-tool grant reaches every function a later version of the other plugin adds, without anyone approving\nit.",[1855,2498,2499],{},"Fix: name each function the plugin's agents and flows call.",[2126,2501,2503],{"id":2502},"oz-s011","OZ-S011",[1855,2505,2506,2507,2509,2510,2513,2514,2517,2518,2006],{},"A verified connector has no evals that replay offline, or no contract tests of its own. Verified connectors only; an error with ",[1883,2508,1987],{},". A connector with functions needs tests in ",[1883,2511,2512],{},"tests\u002F",". A connector with a flow, or an agent that calls a model and is not its generic delegate, needs an eval whose every case replays from a recording (",[1883,2515,2516],{},"evals\u002Fcassettes\u002F\u003Ceval>\u002F\u003Ccase>.jsonl",", or a flow's ",[1883,2519,2520],{},"evals\u002Fsteps\u002F\u003Ceval>\u002F\u003Ccase>.json",[1855,2522,2523,2524,2526,2527,2531],{},"The delegate (tagged ",[1883,2525,2182],{},", calling only the connector's own functions) needs none: it does what the agent handing it work asks, with the functions the tests cover, so the eval of that work belongs to the capability that delegates. An install's ",[1877,2528,2530],{"href":2529},"\u002Fimprove\u002Fevals\u002Fquality-gates#quality-gates","quality gate"," does not replay recorded model answers, so an eval of the delegate would make every install and update of the connector call your models.",[1855,2533,2534],{},"Why: a connector is tested against a fake of its system, shaped from the vendor's documentation, so CI can run it\nwithout the system, and its evals run without a model.",[1855,2536,2537,2538,2541],{},"Fix: add the tests, and record the evals' answers (",[1877,2539,2540],{"href":970},"evals","). Include a test, for each function\nthat sends to people, that the AI label is on what it sends.",[2126,2543,1964],{"id":2544},"oz-s012",[1855,2546,2547,2548,2271],{},"The plugin depends on LiteLLM. An error for every plugin and template, verified or not. It reads every folder\nthe plugin carries but a checkout's ",[1883,2549,2550],{},".git",[1870,2552,2553,2644,2692,2711,2721],{},[1873,2554,2555,2556,2559,2560,1919,2563,2566,2567,2570,2571,1951,2574,2577,2578,2142,2581,2583,2584,2142,2587,2590,2591,1919,2594,2597,2598,1919,2601,1919,2604,1919,2607,1919,2610,1919,2613,2566,2616,1919,2619,1951,2622,2625,2626,2629,2630,2632,2633,2636,2637,2142,2640,2643],{},"dependency files: ",[1883,2557,2558],{},"pyproject.toml"," (requirement lists and the tables of poetry and pdm), ",[1883,2561,2562],{},"Pipfile",[1883,2564,2565],{},"setup.cfg",",\n",[1883,2568,2569],{},"setup.py","'s requirement strings, requirements and constraints files (",[1883,2572,2573],{},"requirements*.txt",[1883,2575,2576],{},".in",", and any\n",[1883,2579,2580],{},".txt",[1883,2582,2576],{}," in a ",[1883,2585,2586],{},"requirements",[1883,2588,2589],{},"constraints"," folder), conda's ",[1883,2592,2593],{},"environment.yml",[1883,2595,2596],{},"package.json",", and the\nlockfiles ",[1883,2599,2600],{},"uv.lock",[1883,2602,2603],{},"poetry.lock",[1883,2605,2606],{},"pdm.lock",[1883,2608,2609],{},"Pipfile.lock",[1883,2611,2612],{},"package-lock.json",[1883,2614,2615],{},"npm-shrinkwrap.json",[1883,2617,2618],{},"yarn.lock",[1883,2620,2621],{},"pnpm-lock.yaml",[1883,2623,2624],{},"bun.lock"," (a lockfile names transitive dependencies too).",[2627,2628],"br",{},"A TOML, JSON or\nYAML file among them is decoded as its installer decodes it, and every name in it is read after its quoting and\nescapes; one that does not decode is an error.",[2627,2631],{},"A requirements file is read as pip reads it: lines continued with a\nbackslash, requirements given as a URL (a wheel, an archive, a repository, ",[1883,2634,2635],{},"#egg=","), and the files it reads with\n",[1883,2638,2639],{},"-r",[1883,2641,2642],{},"-c"," whatever their names (one outside the plugin, or by URL, is an error);",[1873,2645,2646,2647,1919,2650,1919,2653,2656,2657,2142,2660,2663,2664,2667,2668,2142,2671,2674,2675,1919,2678,2142,2681,2684,2685,2142,2688,2691],{},"Python sources (",[1883,2648,2649],{},".py",[1883,2651,2652],{},".pyi",[1883,2654,2655],{},".pyw",") and notebooks' code cells, read as Python's tokenizer reads them, with\nevery line ending (LF, CRLF or a lone CR), comments and strings apart: an ",[1883,2658,2659],{},"import",[1883,2661,2662],{},"from"," statement of any form,\nafter a colon (",[1883,2665,2666],{},"try: import litellm","), across a backslash or brackets, a module named in a string to\n",[1883,2669,2670],{},"importlib.import_module",[1883,2672,2673],{},"__import__",", an import in a string given to ",[1883,2676,2677],{},"exec",[1883,2679,2680],{},"eval",[1883,2682,2683],{},"compile",", and a\nnotebook's ",[1883,2686,2687],{},"!pip install",[1883,2689,2690],{},"%pip install"," line;",[1873,2693,2694,2695,1919,2698,1919,2701,2704,2705,1951,2707,2710],{},"JavaScript and TypeScript sources: ",[1883,2696,2697],{},"require",[1883,2699,2700],{},"import ... from",[1883,2702,2703],{},"export ... from",", a bare ",[1883,2706,2659],{},[1883,2708,2709],{},"import()","\nof a string;",[1873,2712,2713,2714,1951,2717,2720],{},"a package of LiteLLM's installed or vendored in any folder, ",[1883,2715,2716],{},".venv",[1883,2718,2719],{},"node_modules"," included, by its folder's\nname, and a wheel or source archive of it the plugin carries;",[1873,2722,2723,2724,2727],{},"a package tool's pinned closure (the lock the edge makes when it pins ",[1883,2725,2726],{},"package:","), by its packages' names: a\npackage that depends on LiteLLM through others is refused when the edge pins it, in dev mode too.",[1855,2729,2730],{},"A file larger than 16 MiB, a file or folder the rule cannot read, or more files than it reads, is an error too: the\nrule says the plugin holds no LiteLLM only when it read all of it. What it cannot see is a module name made at run\ntime from parts or escapes, or code a package fetches when it runs: the lockfiles and the pinned closures, which the\nrule decodes, name every package a node installs.",[1855,2732,2733],{},"Why: LiteLLM's supply chain was compromised in March 2026, and OZ's gateway already does what it is used for. Agents\nand tools call models through the gateway, where budgets, data rules and metering apply.",[1855,2735,2736],{},"Fix: take LiteLLM out, and the package that brings it in. Call the model with the provider's own SDK, or an\nOpenAI-compatible client pointed at the gateway's base URL, and lock again.",[2126,2738,2740],{"id":2739},"oz-s013","OZ-S013",[1855,2742,2743],{},"The plugin is for an area of the AI Act's Annex III. A warning. It reads the purposes the plugin's agents and\nflows declare and the descriptions of the plugin, its agents and its flows, and finds words that point at an Annex III\narea: biometrics, critical infrastructure, education, employment and workers' management, access to essential\nservices (credit scoring, insurance pricing, public benefits, emergency calls), law enforcement, migration and border\ncontrol, and the administration of justice and democratic processes.",[1855,2745,2746,2747,2750],{},"Why: an AI system used in these areas may be high-risk under the AI Act, with duties the Act sets out. None of the\nproject's published plugins is for these areas. Lint sees only what the plugin\nsays about itself; what a tenant records in its ",[1877,2748,2749],{"href":1182},"inventory"," (a risk class, a purpose) is the\ntenant's, and lint never reads it. The rule is a reminder, not a classification.",[1855,2752,2753],{},"Fix: if the plugin is meant for such an area, have its use reviewed before anyone runs it, and record its agents'\nrisk class in the tenant's inventory. If the words mean something else here, rephrase them.",[2126,2755,1992],{"id":2756},"oz-s014",[1855,2758,2759,2760,2762],{},"The measured tool listing is missing, leaves a tool out or is stale, so the rules that read it could not run. At\nthe verified level, an error; without ",[1883,2761,1987],{},", lint prints a note instead, so a new plugin does not warn until it\nis measured. It finds three things:",[1870,2764,2765,2771,2782],{},[1873,2766,2767,2768,2770],{},"no ",[1883,2769,1975],{}," at all, said once (unless every tool is a remote one read from its snapshot);",[1873,2772,2773,2774,1919,2777,2142,2779,2781],{},"a tool with a server (",[1883,2775,2776],{},"mcp:",[1883,2778,2726],{},[1883,2780,1996],{},") whose functions the listing does not hold, one finding per tool\n(a remote tool with a committed snapshot is read from the snapshot instead);",[1873,2783,2784,2785,2788,2789,2792],{},"a listing measured from other files than the plugin's now: its ",[1883,2786,2787],{},"source_digest"," is not the digest of the files\n",[1883,2790,2791],{},"oz0 plugin pack"," packs.",[1855,2794,2795],{},"Why: the functions' annotations and output schemas are in what the plugin's servers list, which only running them\nshows. OZ-S004 and OZ-S008 read them, so a listing that leaves a tool out, or one from before a function changed,\nwould let them pass on functions they never saw.",[1855,2797,2798,2799,2142,2801,2803,2804,2806,2807,2006],{},"Fix: run ",[1883,2800,1979],{},[1883,2802,1983],{},", which start the plugin's servers on a test node and\nwrite ",[1883,2805,1975],{},", after your last change. Commit it with the files it was measured from, or measure it in CI\nbefore you lint. A remote tool is measured by its snapshot instead (",[1877,2808,2005],{"href":2004},[2126,2810,2005],{"id":2811},"oz-s015",[1855,2813,2814,2815,2817,2818,2820,2821,1919,2824,1919,2827,2830,2831,2833,2834,2836,2837,2006],{},"A tool is not pinned. Verified plugins only; an error with ",[1883,2816,1987],{},". It finds a ",[1883,2819,2726],{}," that does not name one exact version (",[1883,2822,2823],{},"pypi:\u003Cname>==\u003Cversion>",[1883,2825,2826],{},"npm:\u003Cname>@\u003Cversion>",[1883,2828,2829],{},"oci:\u003Cimage>@sha256:\u003Cdigest>","), and a remote (",[1883,2832,1996],{},") tool without a committed snapshot of the functions it expects, ",[1883,2835,2000],{},", or with one whose hashes are not its listings' or that lacks a function the manifest names (an override, ",[1883,2838,1885],{},[1855,2840,2841,2842,2845,2846,2849,2850,2853,2854,2146,2857,2860,2861,2864,2865,2868],{},"It also finds a function's ",[1883,2843,2844],{},"ai_label"," that points at an argument the snapshot's input schema does not give as a string (a nullable string, a local ",[1883,2847,2848],{},"$ref"," and a branch of ",[1883,2851,2852],{},"anyOf"," count; a reference to another document does not). A pointer into an open object counts as pinned: an object that names no properties and takes any key (",[1883,2855,2856],{},"{\"type\": \"object\"}",[1883,2858,2859],{},"additionalProperties: true","), as an issue tracker's ",[1883,2862,2863],{},"fields"," often is, so ",[1883,2866,2867],{},"ai_label: \u002Ffields\u002Fdescription"," passes.",[1855,2870,2871,2872,2875,2876,2879],{},"The snapshot pins that the server takes such a member, and the node labels it when a call gives it as text and refuses the call when it gives something else. An object whose ",[1883,2873,2874],{},"additionalProperties"," is a schema gives its members that schema, and one that names its properties or says ",[1883,2877,2878],{},"additionalProperties: false"," takes only what it names, so a pointer past them is still a finding.",[1855,2881,2882],{},"Why: a verified plugin is what was tested. A package that floats to a newer version, or a remote server that lists\nother functions than the ones the plugin was written and tested for, is something else. The snapshot also lets lint\nread a remote tool's functions: OZ-S004 and OZ-S008 check them with the manifest's overrides merged, as a node merges\nthem.",[1855,2884,2885],{},"Fix: pin the version you tested. For a remote tool, commit its snapshot: the functions you expect the server to list\n(names, descriptions, input and output schemas, annotations), each with the hash a node's tool snapshot gives its\nlisting (SHA-256 of its canonical JSON), and a contract test that a fake of the server lists exactly that.",[1855,2887,2888,2891,2892,2896,2897,2900,2901,2904],{},[1883,2889,2890],{},"oz0 plugin new --template mcp-connector"," writes both. The first node's ",[1877,2893,2895],{"href":2894},"\u002Fbuild\u002Fparts\u002Ftools\u002Fsnapshots#snapshots-a-tool-may-not-change-what-it-says-it-does","snapshot","\nstays what decides which functions nodes call; compare it with yours in ",[1883,2898,2899],{},"oz0 catalog --json",". A snapshot may also\nname the server's ",[1883,2902,2903],{},"url"," as the manifest writes it (placeholders and all); when it does, it must be the manifest's.",[2023,2906,2911],{"className":2907,"code":2908,"filename":2909,"language":2910,"meta":2028,"style":2028},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"format\": \"oz0.tool-snapshot.v1\",\n  \"tool\": \"tracker\",\n  \"listed_from\": \"the vendor's MCP server documentation, read 2026-10-14\",\n  \"functions\": [\n    {\"name\": \"tracker.list_issues\", \"hash\": \"sha256:...\",\n     \"listing\": {\"name\": \"list_issues\", \"description\": \"List the open issues.\",\n                 \"inputSchema\": {\"type\": \"object\", \"properties\": {}}}}\n  ]\n}\n","snapshots\u002Ftracker.json","json",[1883,2912,2913,2918,2942,2962,2983,2998,3041,3093,3138,3144],{"__ignoreMap":2028},[2032,2914,2915],{"class":2034,"line":2035},[2032,2916,2917],{"class":2087},"{\n",[2032,2919,2920,2923,2927,2930,2932,2935,2938,2940],{"class":2034,"line":2055},[2032,2921,2922],{"class":2087},"  \"",[2032,2924,2926],{"class":2925},"spNyl","format",[2032,2928,2929],{"class":2087},"\"",[2032,2931,2271],{"class":2087},[2032,2933,2934],{"class":2087}," \"",[2032,2936,2937],{"class":2041},"oz0.tool-snapshot.v1",[2032,2939,2929],{"class":2087},[2032,2941,2566],{"class":2087},[2032,2943,2944,2946,2949,2951,2953,2955,2958,2960],{"class":2034,"line":2073},[2032,2945,2922],{"class":2087},[2032,2947,2948],{"class":2925},"tool",[2032,2950,2929],{"class":2087},[2032,2952,2271],{"class":2087},[2032,2954,2934],{"class":2087},[2032,2956,2957],{"class":2041},"tracker",[2032,2959,2929],{"class":2087},[2032,2961,2566],{"class":2087},[2032,2963,2965,2967,2970,2972,2974,2976,2979,2981],{"class":2034,"line":2964},4,[2032,2966,2922],{"class":2087},[2032,2968,2969],{"class":2925},"listed_from",[2032,2971,2929],{"class":2087},[2032,2973,2271],{"class":2087},[2032,2975,2934],{"class":2087},[2032,2977,2978],{"class":2041},"the vendor's MCP server documentation, read 2026-10-14",[2032,2980,2929],{"class":2087},[2032,2982,2566],{"class":2087},[2032,2984,2986,2988,2991,2993,2995],{"class":2034,"line":2985},5,[2032,2987,2922],{"class":2087},[2032,2989,2990],{"class":2925},"functions",[2032,2992,2929],{"class":2087},[2032,2994,2271],{"class":2087},[2032,2996,2997],{"class":2087}," [\n",[2032,2999,3001,3004,3006,3009,3011,3013,3015,3018,3020,3023,3025,3028,3030,3032,3034,3037,3039],{"class":2034,"line":3000},6,[2032,3002,3003],{"class":2087},"    {",[2032,3005,2929],{"class":2087},[2032,3007,3008],{"class":2038},"name",[2032,3010,2929],{"class":2087},[2032,3012,2271],{"class":2087},[2032,3014,2934],{"class":2087},[2032,3016,3017],{"class":2041},"tracker.list_issues",[2032,3019,2929],{"class":2087},[2032,3021,3022],{"class":2087},",",[2032,3024,2934],{"class":2087},[2032,3026,3027],{"class":2038},"hash",[2032,3029,2929],{"class":2087},[2032,3031,2271],{"class":2087},[2032,3033,2934],{"class":2087},[2032,3035,3036],{"class":2041},"sha256:...",[2032,3038,2929],{"class":2087},[2032,3040,2566],{"class":2087},[2032,3042,3044,3047,3050,3052,3054,3057,3059,3062,3064,3066,3068,3071,3073,3075,3077,3080,3082,3084,3086,3089,3091],{"class":2034,"line":3043},7,[2032,3045,3046],{"class":2087},"     \"",[2032,3048,3049],{"class":2038},"listing",[2032,3051,2929],{"class":2087},[2032,3053,2271],{"class":2087},[2032,3055,3056],{"class":2087}," {",[2032,3058,2929],{"class":2087},[2032,3060,3008],{"class":3061},"sbssI",[2032,3063,2929],{"class":2087},[2032,3065,2271],{"class":2087},[2032,3067,2934],{"class":2087},[2032,3069,3070],{"class":2041},"list_issues",[2032,3072,2929],{"class":2087},[2032,3074,3022],{"class":2087},[2032,3076,2934],{"class":2087},[2032,3078,3079],{"class":3061},"description",[2032,3081,2929],{"class":2087},[2032,3083,2271],{"class":2087},[2032,3085,2934],{"class":2087},[2032,3087,3088],{"class":2041},"List the open issues.",[2032,3090,2929],{"class":2087},[2032,3092,2566],{"class":2087},[2032,3094,3096,3099,3102,3104,3106,3108,3110,3113,3115,3117,3119,3122,3124,3126,3128,3131,3133,3135],{"class":2034,"line":3095},8,[2032,3097,3098],{"class":2087},"                 \"",[2032,3100,3101],{"class":3061},"inputSchema",[2032,3103,2929],{"class":2087},[2032,3105,2271],{"class":2087},[2032,3107,3056],{"class":2087},[2032,3109,2929],{"class":2087},[2032,3111,3112],{"class":2254},"type",[2032,3114,2929],{"class":2087},[2032,3116,2271],{"class":2087},[2032,3118,2934],{"class":2087},[2032,3120,3121],{"class":2041},"object",[2032,3123,2929],{"class":2087},[2032,3125,3022],{"class":2087},[2032,3127,2934],{"class":2087},[2032,3129,3130],{"class":2254},"properties",[2032,3132,2929],{"class":2087},[2032,3134,2271],{"class":2087},[2032,3136,3137],{"class":2087}," {}}}}\n",[2032,3139,3141],{"class":2034,"line":3140},9,[2032,3142,3143],{"class":2087},"  ]\n",[2032,3145,3147],{"class":2034,"line":3146},10,[2032,3148,3149],{"class":2087},"}\n",[2126,3151,3153],{"id":3152},"oz-s016","OZ-S016",[1855,3155,3156,3157,3160],{},"A verified agent names a vendor's model without ",[1883,3158,3159],{},"model.vendor_reason",". Verified level only, where it is an\nerror.",[1855,3162,3163,3164,2142,3167,3170,3171,1919,3173,1951,3175,3177,3178,3182],{},"Why: an agent that names ",[1883,3165,3166],{},"anthropic\u002F...",[1883,3168,3169],{},"openai\u002F..."," runs only for tenants who pay that vendor. An agent that asks\nfor an alias runs on whatever models the tenant maps it to, and every tenant has ",[1883,3172,1918],{},[1883,3174,1922],{},[1883,3176,1925],{}," once a\nprovider is set up (",[1877,3179,3181],{"href":3180},"\u002Fspend\u002Fmodels-and-keys\u002Faliases#the-standard-aliases","the standard aliases","). Some agents do need one\nvendor: an agent on the OpenAI Agents SDK, or one that uses a vendor's own server-side feature.",[1855,3184,3185],{},"Fix: ask for an alias with what the agent needs of it:",[2023,3187,3189],{"className":2245,"code":3188,"language":2247,"meta":2028,"style":2028},"model: {use: default, needs: [tools]}\n",[1883,3190,3191],{"__ignoreMap":2028},[2032,3192,3193,3196,3198,3200,3203,3205,3208,3210,3213,3215,3217,3220],{"class":2034,"line":2035},[2032,3194,3195],{"class":2254},"model",[2032,3197,2271],{"class":2087},[2032,3199,3056],{"class":2087},[2032,3201,3202],{"class":2254},"use",[2032,3204,2271],{"class":2087},[2032,3206,3207],{"class":2041}," default",[2032,3209,3022],{"class":2087},[2032,3211,3212],{"class":2254}," needs",[2032,3214,2271],{"class":2087},[2032,3216,2274],{"class":2087},[2032,3218,3219],{"class":2041},"tools",[2032,3221,3222],{"class":2087},"]}\n",[1855,3224,3225],{},"or, when the agent needs the vendor's own feature, keep the model and say which in one sentence:",[2023,3227,3229],{"className":2245,"code":3228,"language":2247,"meta":2028,"style":2028},"model:\n  primary: openai\u002Fgpt-5.5\n  vendor_reason: Runs on the OpenAI Agents SDK, whose hand-offs need an OpenAI model.\n",[1883,3230,3231,3237,3247],{"__ignoreMap":2028},[2032,3232,3233,3235],{"class":2034,"line":2035},[2032,3234,3195],{"class":2254},[2032,3236,2258],{"class":2087},[2032,3238,3239,3242,3244],{"class":2034,"line":2055},[2032,3240,3241],{"class":2254},"  primary",[2032,3243,2271],{"class":2087},[2032,3245,3246],{"class":2041}," openai\u002Fgpt-5.5\n",[2032,3248,3249,3252,3254],{"class":2034,"line":2073},[2032,3250,3251],{"class":2254},"  vendor_reason",[2032,3253,2271],{"class":2087},[2032,3255,3256],{"class":2041}," Runs on the OpenAI Agents SDK, whose hand-offs need an OpenAI model.\n",[2126,3258,3260],{"id":3259},"oz-s017","OZ-S017",[1855,3262,3263],{},"A verified plugin asks for a model provider's key. Verified level only, where it is an error.",[1855,3265,3266,3267,2142,3269,3271,3272,1919,3275,2566,3278,3281],{},"Why: a provider's key in ",[1883,3268,2214],{},[1883,3270,2217],{}," (",[1883,3273,3274],{},"ANTHROPIC_API_KEY",[1883,3276,3277],{},"OPENAI_API_KEY",[1883,3279,3280],{},"OPENROUTER_API_KEY"," or any other provider preset's key) reaches the plugin's own processes. With it, a tool calls the\nprovider around the gateway: unmetered, outside every budget and quota, and outside the tenant's data rules.",[1855,3283,3284,3285,3289],{},"Fix: take the key out and ask the platform for models\n(",[1877,3286,3288],{"href":3287},"\u002Fbuild\u002Fparts\u002Ftools\u002Fmodel-calls#tools-that-need-a-model","tools that need a model","):",[2023,3291,3293],{"className":2245,"code":3292,"language":2247,"meta":2028,"style":2028},"requires:\n  models:\n    sampling: default            # MCP sampling, answered as the job's model call\n    gateway: [openai-embeddings] # a per-call token for what sampling cannot express\n",[1883,3294,3295,3301,3308,3320],{"__ignoreMap":2028},[2032,3296,3297,3299],{"class":2034,"line":2035},[2032,3298,2255],{"class":2254},[2032,3300,2258],{"class":2087},[2032,3302,3303,3306],{"class":2034,"line":2055},[2032,3304,3305],{"class":2254},"  models",[2032,3307,2258],{"class":2087},[2032,3309,3310,3313,3315,3317],{"class":2034,"line":2073},[2032,3311,3312],{"class":2254},"    sampling",[2032,3314,2271],{"class":2087},[2032,3316,3207],{"class":2041},[2032,3318,3319],{"class":2051},"            # MCP sampling, answered as the job's model call\n",[2032,3321,3322,3325,3327,3329,3332,3335],{"class":2034,"line":2964},[2032,3323,3324],{"class":2254},"    gateway",[2032,3326,2271],{"class":2087},[2032,3328,2274],{"class":2087},[2032,3330,3331],{"class":2041},"openai-embeddings",[2032,3333,3334],{"class":2087},"]",[2032,3336,3337],{"class":2051}," # a per-call token for what sampling cannot express\n",[2126,3339,3341],{"id":3340},"oz-s018","OZ-S018",[1855,3343,3344,3345,3347,3348,3350,3351,3354],{},"A write the plugin's suggested policy does not ask about. Verified level only, where it is an error. It reads\nthe measured listing: a function that does not say ",[1883,3346,2317],{},", is not under its tool's ",[1883,3349,1885],{},",\nand is not covered by a rule of the plugin's ",[1883,3352,3353],{},"policy:"," without a condition that asks or refuses.",[1855,3356,3357,3358,3361],{},"Why: a verified plugin's writes ask a person by default. The install screen shows that default, \"Ask\", with the\nplugin's reason, and the installer may switch a write, or the whole group of writes, to Allow with a reason. A judge\ndoes not count as an explicit requirement for human approval. A suggested\njudge is currently written as Ask, so the separate check of ",[1877,3359,3360],{"href":669},"what an agent combines",", which counts\nanything but Allow, counts it as closing.",[1855,3363,3364,3365,2271],{},"Fix: add a rule for the function to the manifest's ",[1883,3366,3353],{},[2023,3368,3370],{"className":2245,"code":3369,"language":2247,"meta":2028,"style":2028},"policy:\n  - match: oz0_jira.create_issue\n    action: ask\n    reason: the plugin asks before it writes\n",[1883,3371,3372,3378,3391,3401],{"__ignoreMap":2028},[2032,3373,3374,3376],{"class":2034,"line":2035},[2032,3375,2145],{"class":2254},[2032,3377,2258],{"class":2087},[2032,3379,3380,3383,3386,3388],{"class":2034,"line":2055},[2032,3381,3382],{"class":2087},"  -",[2032,3384,3385],{"class":2254}," match",[2032,3387,2271],{"class":2087},[2032,3389,3390],{"class":2041}," oz0_jira.create_issue\n",[2032,3392,3393,3396,3398],{"class":2034,"line":2073},[2032,3394,3395],{"class":2254},"    action",[2032,3397,2271],{"class":2087},[2032,3399,3400],{"class":2041}," ask\n",[2032,3402,3403,3406,3408],{"class":2034,"line":2964},[2032,3404,3405],{"class":2254},"    reason",[2032,3407,2271],{"class":2087},[2032,3409,3410],{"class":2041}," the plugin asks before it writes\n",[1855,3412,3413,3415,3416,3418],{},[1883,3414,2490],{}," covers every function of a tool, reads included, which then ask too: name the writes. Put a function under\n",[1883,3417,1885],{}," instead only when a person must decide every call, whatever the tenant chooses: an effect that\ncannot be undone and reaches outside the tenant (sending mail, merging into a protected branch), or a call the system\nexpects a named person to authorise.",[2126,3420,3422],{"id":3421},"oz-s019","OZ-S019",[1855,3424,3425],{},"References to another plugin's parts name it. A warning; an error at the verified level.",[1855,3427,3428,3429,3431,3432,3435],{},"Why: a bare name means a part of the same plugin. When an agent, a flow, a hook or an eval names another plugin's\nfunction or agent by its bare name, a reader of the file cannot tell that it reaches across plugins, or which plugin\nit needs under ",[1883,3430,2192],{},". The address ",[1883,3433,3434],{},"\u003Cplugin>\u002F\u003Cpart>"," says both where it is written.",[1855,3437,3438,3439,3441],{},"Fix: write the address, which ",[1883,3440,2477],{}," does for YAML files:",[2023,3443,3445],{"className":2245,"code":3444,"language":2247,"meta":2028,"style":2028},"# before\ntools:\n  - oz0_github.get_pull_request\n# after\ntools:\n  - github\u002Foz0_github.get_pull_request\n",[1883,3446,3447,3452,3458,3465,3470,3476],{"__ignoreMap":2028},[2032,3448,3449],{"class":2034,"line":2035},[2032,3450,3451],{"class":2051},"# before\n",[2032,3453,3454,3456],{"class":2034,"line":2055},[2032,3455,3219],{"class":2254},[2032,3457,2258],{"class":2087},[2032,3459,3460,3462],{"class":2034,"line":2073},[2032,3461,3382],{"class":2087},[2032,3463,3464],{"class":2041}," oz0_github.get_pull_request\n",[2032,3466,3467],{"class":2034,"line":2964},[2032,3468,3469],{"class":2051},"# after\n",[2032,3471,3472,3474],{"class":2034,"line":2985},[2032,3473,3219],{"class":2254},[2032,3475,2258],{"class":2087},[2032,3477,3478,3480],{"class":2034,"line":3000},[2032,3479,3382],{"class":2087},[2032,3481,3482],{"class":2041}," github\u002Foz0_github.get_pull_request\n",[1855,3484,3485],{},"The bundle still holds the bare name, so the change asks nothing of running jobs or older nodes.",[2126,3487,3489],{"id":3488},"oz-s020","OZ-S020",[1855,3491,3492],{},"An agent that combines private data, outside input and sending out asks before it sends. A warning; at the\nverified level an error for a capability, and a note for the other kinds. It reads the measured listing, the\nmanifest and the plugin's own flows.",[1855,3494,3495],{},"Why: an agent that reads private data, is steered by text from outside and may send without anyone asked could be\ntalked into sending that data away in one job. Lint reads the plugin alone, so it finds:",[1870,3497,3498,3504,3518],{},[1873,3499,3500,3501,1897],{},"private data: a function whose tool has a connection, or declares a label source (",[1883,3502,3503],{},"labels.source",[1873,3505,3506,3507,3510,3511,1919,3514,3517],{},"outside input: a function that does not say ",[1883,3508,3509],{},"openWorldHint: false"," (or a remote server's), a tool with\n",[1883,3512,3513],{},"labels.untrusted: true",[1883,3515,3516],{},"oz.wait_for_event",", and a flow of the plugin whose webhook or event trigger runs the\nagent in a step;",[1873,3519,3520],{},"sending out: a function of type Write, Sends out, Destructive or Unknown.",[1855,3522,3523,3524,3526,3527,3529,3530,2021],{},"It flags the agent when it holds all three and a sending function runs without asking: its default, before any tenant\nrule, is Allow (the plugin's suggestion first, then what the function declares; ",[1883,3525,1885],{}," always asks).\nAnother plugin's function under ",[1883,3528,2192],{}," is Unknown to lint, so it counts as sending out and asks as Unknown does; the\ninstall screen reads its real type and the tenant's rules. See ",[1877,3531,668],{"href":669},[1855,3533,3534,3535,2271],{},"Fix: ask about each sending function the finding names, in the plugin's ",[1883,3536,3353],{},[2023,3538,3540],{"className":2245,"code":3539,"language":2247,"meta":2028,"style":2028},"policy:\n  - match: oz0_notes.save\n    action: ask\n    reason: a person decides what an agent that reads private data and outside input sends\n",[1883,3541,3542,3548,3559,3567],{"__ignoreMap":2028},[2032,3543,3544,3546],{"class":2034,"line":2035},[2032,3545,2145],{"class":2254},[2032,3547,2258],{"class":2087},[2032,3549,3550,3552,3554,3556],{"class":2034,"line":2055},[2032,3551,3382],{"class":2087},[2032,3553,3385],{"class":2254},[2032,3555,2271],{"class":2087},[2032,3557,3558],{"class":2041}," oz0_notes.save\n",[2032,3560,3561,3563,3565],{"class":2034,"line":2073},[2032,3562,3395],{"class":2254},[2032,3564,2271],{"class":2087},[2032,3566,3400],{"class":2041},[2032,3568,3569,3571,3573],{"class":2034,"line":2964},[2032,3570,3405],{"class":2254},[2032,3572,2271],{"class":2087},[2032,3574,3575],{"class":2041}," a person decides what an agent that reads private data and outside input sends\n",[1855,3577,3578,3579,3581],{},"Or take an ingredient away: say ",[1883,3580,3509],{}," on a function that only reads the tenant's own data, or give\nthe outside input to another agent that cannot send.",[2126,3583,3585],{"id":3584},"oz-s021","OZ-S021",[1855,3587,3588,3589,3591],{},"A verified capability's ",[1883,3590,2192],{}," give each connector a range with an upper bound. Verified level only, where it\nis an error.",[1855,3593,3594,3595,3597,3598,3602],{},"Why: an update of a plugin is checked against every installed plugin whose ",[1883,3596,2192],{}," names it\n(",[1877,3599,3601],{"href":3600},"\u002Fbuild\u002Fplugins\u002Finstall\u002Fupdate#updates-and-the-plugins-that-use-them","updates and the plugins that use them","): a version outside\na dependent's range, or one without a function, agent or skill it names, is refused. A capability with no range takes\nany version, including a next major one that drops what it calls. A range with no upper bound does the same. One exact\nversion is the other mistake: it would hold back the connector's security fix until the capability is released again.",[1855,3604,3605,3606,3289],{},"Fix: give each entry the versions the capability was tested with, from the lowest one its tests read to below the next\nmajor version, and test both ends (",[1877,3607,3609],{"href":3608},"\u002Fbuild\u002Fplugins\u002Fstructure#test-both-ends-of-a-range","test both ends of a range",[2023,3611,3613],{"className":2245,"code":3612,"language":2247,"meta":2028,"style":2028},"uses:\n  github:\n    version: \">=1.1, \u003C2\"\n    tools: [oz0_github.get_pull_request, oz0_github.comment]\n",[1883,3614,3615,3622,3629,3644],{"__ignoreMap":2028},[2032,3616,3617,3620],{"class":2034,"line":2035},[2032,3618,3619],{"class":2254},"uses",[2032,3621,2258],{"class":2087},[2032,3623,3624,3627],{"class":2034,"line":2055},[2032,3625,3626],{"class":2254},"  github",[2032,3628,2258],{"class":2087},[2032,3630,3631,3634,3636,3638,3641],{"class":2034,"line":2073},[2032,3632,3633],{"class":2254},"    version",[2032,3635,2271],{"class":2087},[2032,3637,2934],{"class":2087},[2032,3639,3640],{"class":2041},">=1.1, \u003C2",[2032,3642,3643],{"class":2087},"\"\n",[2032,3645,3646,3649,3651,3653,3656,3658,3661],{"class":2034,"line":2964},[2032,3647,3648],{"class":2254},"    tools",[2032,3650,2271],{"class":2087},[2032,3652,2274],{"class":2087},[2032,3654,3655],{"class":2041},"oz0_github.get_pull_request",[2032,3657,3022],{"class":2087},[2032,3659,3660],{"class":2041}," oz0_github.comment",[2032,3662,2280],{"class":2087},[1855,3664,3665],{},"Exact combinations of versions are what sets carry.",[2126,3667,1896],{"id":3668},"oz-s022",[1855,3670,3671,3672,3674,3675,3677,3678,1919,3681,1919,3684,3687,3688,1919,3691,3694,3695,1919,3698,3701,3702,3705,3706,1919,3709,3712,3713,3716,3717,1919,3720,3723,3724,1919,3727,3730,3731,2006],{},"Egress lists a host that serves files anyone can publish. A warning; an error with ",[1883,3673,1987],{},". It finds an entry of the manifest's ",[1883,3676,2210],{}," or an agent's that reaches a content host: a code host's raw files, archives or gists (",[1883,3679,3680],{},"raw.githubusercontent.com",[1883,3682,3683],{},"codeload.github.com",[1883,3685,3686],{},"github.com","), a package registry (",[1883,3689,3690],{},"registry.npmjs.org",[1883,3692,3693],{},"files.pythonhosted.org","), a container registry (",[1883,3696,3697],{},"registry-1.docker.io",[1883,3699,3700],{},"ghcr.io","), a public package CDN, a model hub (",[1883,3703,3704],{},"huggingface.co","), an object store (",[1883,3707,3708],{},"*.s3.amazonaws.com",[1883,3710,3711],{},"storage.googleapis.com","), a paste site (",[1883,3714,3715],{},"pastebin.com","), a temporary file host (",[1883,3718,3719],{},"transfer.sh",[1883,3721,3722],{},"0x0.st","), a tunnel (",[1883,3725,3726],{},"*.ngrok.io",[1883,3728,3729],{},"*.trycloudflare.com",") or a file share (",[1883,3732,3733],{},"cdn.discordapp.com",[1855,3735,3736,3737,3740,3741,2113,3743,3746,3747,3750],{},"A pattern that overlaps one counts too: ",[1883,3738,3739],{},"*.githubusercontent.com"," reaches ",[1883,3742,3680],{},[1883,3744,3745],{},"*.amazonaws.com"," reaches the S3 hosts. The list is one list the server's change reviews, ",[1883,3748,3749],{},"oz0 egress learn",", the install screen and the console read alike.",[1855,3752,3753],{},"Why: whatever anyone publishes there, a session that may reach the host may download and run. A model with a backdoor\nin its weights needs only such a host to fetch its payload, and an injected instruction needs only one to fetch a\nscript. The finding says what the host is; it is a reason to look, not a verdict. Installs never refuse a plugin for\nit: the install screen shows the same note, and a tenant admin decides.",[1855,3755,3756,3757,3760,3761,3763,3764,3767,3768,3771,3772,2146,3774,3763,3776,3779,3780,3782,3783,3785],{},"A connector's own download host is shown at every level and never fails lint. The list names, for such a host, the\nexact hosts of the one system that downloads from it (its companions), and the exception holds only when the\nconnector's manifest lists one of them too: ",[1883,3758,3759],{},"ai.oz0\u002Fgithub"," lists ",[1883,3762,3683],{}," beside ",[1883,3765,3766],{},"api.github.com",", for the\nrepository archives the API redirects to. A host on the same domain is not enough: ",[1883,3769,3770],{},"gist.github.com"," beside\n",[1883,3773,3766],{},[1883,3775,3708],{},[1883,3777,3778],{},"sts.amazonaws.com",", still fails with ",[1883,3781,1987],{},", so adding a\nharmless host never silences the rule. An agent's ",[1883,3784,2210],{}," has no such exception.",[1855,3787,3788,3789,3791],{},"Fix: keep the host only if the plugin must download from it, and say in the plugin's docs what it fetches there. A\nhost only some customers need, such as their package mirror or bucket, goes on the tenant's egress allowlist instead\n(",[1883,3790,2358],{},"), where a widening is a reviewed change that shows the same note.",[3793,3794,3795],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html 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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":2028,"searchDepth":2055,"depth":2055,"links":3797},[3798,3799],{"id":1864,"depth":2055,"text":1865},{"id":2123,"depth":2055,"text":2124,"children":3800},[3801,3802,3803,3804,3805,3806,3807,3808,3809,3810,3811,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,3822],{"id":2128,"depth":2073,"text":2129},{"id":2175,"depth":2073,"text":2176},{"id":2199,"depth":2073,"text":2200},{"id":2286,"depth":2073,"text":2287},{"id":2334,"depth":2073,"text":2335},{"id":2362,"depth":2073,"text":2363},{"id":2402,"depth":2073,"text":2403},{"id":2438,"depth":2073,"text":2439},{"id":2460,"depth":2073,"text":2461},{"id":2481,"depth":2073,"text":2482},{"id":2502,"depth":2073,"text":2503},{"id":2544,"depth":2073,"text":1964},{"id":2739,"depth":2073,"text":2740},{"id":2756,"depth":2073,"text":1992},{"id":2811,"depth":2073,"text":2005},{"id":3152,"depth":2073,"text":3153},{"id":3259,"depth":2073,"text":3260},{"id":3340,"depth":2073,"text":3341},{"id":3421,"depth":2073,"text":3422},{"id":3488,"depth":2073,"text":3489},{"id":3584,"depth":2073,"text":3585},{"id":3668,"depth":2073,"text":1896},"md",null,{"audience":3826,"doc_type":3827},"plugin authors","reference",{"icon":373},{"title":375,"description":1860},"foNfxm_7-swcxFA_0X4UpQsDvjcVc4NT5P9xusUwyWI",[3832,3834],{"title":368,"path":369,"stem":370,"description":3833,"icon":373,"children":-1},"Choose plugin boundaries, names and permissions.",{"title":379,"path":380,"stem":381,"description":3835,"icon":384,"children":-1},"Reload local edits and exercise tools during development.",1794442989274]