[{"data":1,"prerenderedAt":83},["ShallowReactive",2],{"search-en":3,"content-en-developer\u002Fdecisions\u002F053-sandboxed-plugin-jobs":4,"surround-en-\u002Fdeveloper\u002Fdecisions\u002F053-sandboxed-plugin-jobs":74},[],{"id":5,"title":6,"body":7,"description":66,"extension":67,"meta":68,"navigation":69,"path":70,"seo":71,"stem":72,"__hash__":73},"content_en\u002F3.developer\u002Fdecisions\u002F16.053-sandboxed-plugin-jobs.md","ADR-053: Sandboxed Plugin Jobs",{"type":8,"value":9,"toc":59},"minimark",[10,27,32,36,40,43,46,50],[11,12,13,21],"ul",{},[14,15,16,20],"li",{},[17,18,19],"strong",{},"Status:"," Accepted as a protocol; host enqueue adapter not shipped",[14,22,23,26],{},[17,24,25],{},"Date:"," 2026-07-19",[28,29,31],"h2",{"id":30},"context","Context",[33,34,35],"p",{},"Long-running or untrusted work does not belong in Convex actions or the web process. Passing arbitrary commands to the existing code worker, however, would turn a plugin payload into remote shell execution.",[28,37,39],{"id":38},"decision","Decision",[33,41,42],{},"The protocol admits data-only jobs whose namespaced kind resolves through a host-controlled own-property registry. No host enqueue adapter is currently shipped. When one lands, the worker chooses the executable and argv; payload data is never interpolated into a shell string. Jobs run as an unprivileged uid with hard time and resource limits, a private workspace, and an environment containing no admin, GitHub, Convex, or LLM credentials.",[33,44,45],{},"The host owns claim leases, heartbeat cancellation, retry ceilings, result clamping, and terminal state. Unknown or prototype-inherited job kinds fail before spawn. Any credentialed operation must return through a separately authorized host service.",[28,47,49],{"id":48},"consequences","Consequences",[33,51,52,53,58],{},"Owlat's protocol can support heavy plugin tasks without executing plugin-selected commands or leaking ambient secrets. The worker image must explicitly register every supported job implementation; the host enqueue adapter is not currently shipped. See ",[54,55,57],"a",{"href":56},"\u002Fdeveloper\u002Fplugin-sandboxed-jobs","Sandboxed Jobs",".",{"title":60,"searchDepth":61,"depth":61,"links":62},"",2,[63,64,65],{"id":30,"depth":61,"text":31},{"id":38,"depth":61,"text":39},{"id":48,"depth":61,"text":49},"Heavy or untrusted plugin compute runs as a credential-free process behind a host-owned job registry.","md",{},true,"\u002Fdeveloper\u002Fdecisions\u002F053-sandboxed-plugin-jobs",{"title":6,"description":66},"3.developer\u002Fdecisions\u002F16.053-sandboxed-plugin-jobs","IaJOW00q4FmtHvuSFHLSjxtqzc3E8m1pO2OWIMDhNNg",[75,79],{"title":76,"path":77,"stem":78,"children":-1},"ADR-052: Connected Apps and Signed Hooks","\u002Fdeveloper\u002Fdecisions\u002F052-connected-apps-and-signed-hooks","3.developer\u002Fdecisions\u002F15.052-connected-apps-and-signed-hooks",{"title":80,"path":81,"stem":82,"children":-1},"ADR-001: Custom Email Renderer Over MJML","\u002Fdeveloper\u002Fdecisions\u002F001-custom-email-renderer","3.developer\u002Fdecisions\u002F2.001-custom-email-renderer",1786915101660]