[{"data":1,"prerenderedAt":1375},["ShallowReactive",2],{"navigation_docs":3,"-guides-harnesses-worker-kit":520,"-guides-harnesses-worker-kit-surround":1370},[4,28,51,191,222,485],{"title":5,"path":6,"stem":7,"children":8,"page":-1},"Get started","\u002Fget-started","1.get-started",[9,12,16,20,24],{"title":10,"path":6,"stem":11},"Overview","1.get-started\u002Findex",{"title":13,"path":14,"stem":15},"Why Kraft","\u002Fget-started\u002Fwhy-kraft","1.get-started\u002F0.why-kraft",{"title":17,"path":18,"stem":19},"Install","\u002Fget-started\u002Finstall","1.get-started\u002F1.install",{"title":21,"path":22,"stem":23},"Your first work item","\u002Fget-started\u002Ffirst-work-item","1.get-started\u002F2.first-work-item",{"title":25,"path":26,"stem":27},"FAQ","\u002Fget-started\u002Ffaq","1.get-started\u002F3.faq",{"title":29,"path":30,"stem":31,"children":32,"page":-1},"Concepts","\u002Fconcepts","2.concepts",[33,35,39,43,47],{"title":10,"path":30,"stem":34},"2.concepts\u002Findex",{"title":36,"path":37,"stem":38},"How a work item runs","\u002Fconcepts\u002Fhow-a-work-item-runs","2.concepts\u002F1.how-a-work-item-runs",{"title":40,"path":41,"stem":42},"Caps and budgets","\u002Fconcepts\u002Fcaps-and-budgets","2.concepts\u002F2.caps-and-budgets",{"title":44,"path":45,"stem":46},"Why a permission gate","\u002Fconcepts\u002Fpermission-gate","2.concepts\u002F3.permission-gate",{"title":48,"path":49,"stem":50},"Vocabulary","\u002Fconcepts\u002Fvocabulary","2.concepts\u002F4.vocabulary",{"title":52,"path":53,"stem":54,"children":55,"page":-1},"Guides","\u002Fguides","3.guides",[56,58,96,117,138,187],{"title":10,"path":53,"stem":57},"3.guides\u002Findex",{"title":59,"path":60,"stem":61,"children":62,"page":95},"Day to day","\u002Fguides\u002Fday-to-day","3.guides\u002F1.day-to-day",[63,67,71,75,79,83,87,91],{"title":64,"path":65,"stem":66},"The setup wizard on first start","\u002Fguides\u002Fday-to-day\u002Ffirst-run","3.guides\u002F1.day-to-day\u002F2.first-run",{"title":68,"path":69,"stem":70},"File a work item","\u002Fguides\u002Fday-to-day\u002Ffile-a-work-item","3.guides\u002F1.day-to-day\u002F3.file-a-work-item",{"title":72,"path":73,"stem":74},"Use Kraft from your agent","\u002Fguides\u002Fday-to-day\u002Fagent-integration","3.guides\u002F1.day-to-day\u002F4.agent-integration",{"title":76,"path":77,"stem":78},"Reviewing a change","\u002Fguides\u002Fday-to-day\u002Freview-a-change","3.guides\u002F1.day-to-day\u002F5.review-a-change",{"title":80,"path":81,"stem":82},"Raise a cap on a stopped item","\u002Fguides\u002Fday-to-day\u002Fraise-a-cap","3.guides\u002F1.day-to-day\u002F6.raise-a-cap",{"title":84,"path":85,"stem":86},"Kraft for VS Code","\u002Fguides\u002Fday-to-day\u002Fvscode","3.guides\u002F1.day-to-day\u002F7.vscode",{"title":88,"path":89,"stem":90},"Kraft on a phone","\u002Fguides\u002Fday-to-day\u002Fkraft-on-a-phone","3.guides\u002F1.day-to-day\u002F8.kraft-on-a-phone",{"title":92,"path":93,"stem":94},"Get notified when an item needs you","\u002Fguides\u002Fday-to-day\u002Fnotifications","3.guides\u002F1.day-to-day\u002F9.notifications",false,{"title":97,"path":98,"stem":99,"children":100,"page":95},"Customize and automate","\u002Fguides\u002Fcustomize","3.guides\u002F2.customize",[101,105,109,113],{"title":102,"path":103,"stem":104},"Write your own chain","\u002Fguides\u002Fcustomize\u002Fwrite-your-own-chain","3.guides\u002F2.customize\u002F1.write-your-own-chain",{"title":106,"path":107,"stem":108},"Add a security review or a gate reviewer","\u002Fguides\u002Fcustomize\u002Fadd-review-agents","3.guides\u002F2.customize\u002F2.add-review-agents",{"title":110,"path":111,"stem":112},"Schedule or webhook work","\u002Fguides\u002Fcustomize\u002Fschedule-and-webhook-work","3.guides\u002F2.customize\u002F3.schedule-and-webhook-work",{"title":114,"path":115,"stem":116},"Share chains with add-ons","\u002Fguides\u002Fcustomize\u002Fshare-chains-with-addons","3.guides\u002F2.customize\u002F4.share-chains-with-addons",{"title":118,"path":119,"stem":120,"children":121,"page":95},"Agents and harnesses","\u002Fguides\u002Fharnesses","3.guides\u002F3.harnesses",[122,126,130,134],{"title":123,"path":124,"stem":125},"Switch a task to another harness","\u002Fguides\u002Fharnesses\u002Fswitch-harness","3.guides\u002F3.harnesses\u002F1.switch-harness",{"title":127,"path":128,"stem":129},"Add or override a harness","\u002Fguides\u002Fharnesses\u002Fadding-a-harness","3.guides\u002F3.harnesses\u002F2.adding-a-harness",{"title":131,"path":132,"stem":133},"Build a worker Kit","\u002Fguides\u002Fharnesses\u002Fworker-kit","3.guides\u002F3.harnesses\u002F3.worker-kit",{"title":135,"path":136,"stem":137},"Give a worker its login","\u002Fguides\u002Fharnesses\u002Fgive-a-worker-its-login","3.guides\u002F3.harnesses\u002F4.give-a-worker-its-login",{"title":139,"path":140,"stem":141,"children":142,"page":95},"Run the server","\u002Fguides\u002Frun","3.guides\u002F4.run",[143,147,151,155,159,163,167,171,175,179,183],{"title":144,"path":145,"stem":146},"Remote access","\u002Fguides\u002Frun\u002Fremote-access","3.guides\u002F4.run\u002F01.remote-access",{"title":148,"path":149,"stem":150},"Put a proxy in front of Kraft","\u002Fguides\u002Frun\u002Fput-a-proxy-in-front-of-kraft","3.guides\u002F4.run\u002F02.put-a-proxy-in-front-of-kraft",{"title":152,"path":153,"stem":154},"Restart Kraft without ending running agents","\u002Fguides\u002Frun\u002Frestart-kraft","3.guides\u002F4.run\u002F03.restart-kraft",{"title":156,"path":157,"stem":158},"Back up and restore the database","\u002Fguides\u002Frun\u002Fback-up-and-restore","3.guides\u002F4.run\u002F04.back-up-and-restore",{"title":160,"path":161,"stem":162},"Logs and disk space","\u002Fguides\u002Frun\u002Flogs-and-disk-space","3.guides\u002F4.run\u002F05.logs-and-disk-space",{"title":164,"path":165,"stem":166},"Run Kraft as a service","\u002Fguides\u002Frun\u002Frun-as-a-service","3.guides\u002F4.run\u002F06.run-as-a-service",{"title":168,"path":169,"stem":170},"Upgrade Kraft","\u002Fguides\u002Frun\u002Fupgrade-kraft","3.guides\u002F4.run\u002F07.upgrade-kraft",{"title":172,"path":173,"stem":174},"Upgrade your configuration","\u002Fguides\u002Frun\u002Fupgrade-your-configuration","3.guides\u002F4.run\u002F08.upgrade-your-configuration",{"title":176,"path":177,"stem":178},"Upgrade from 1.4","\u002Fguides\u002Frun\u002Fupgrade-from-1-4","3.guides\u002F4.run\u002F09.upgrade-from-1-4",{"title":180,"path":181,"stem":182},"Upgrade from 0.x or a release candidate","\u002Fguides\u002Frun\u002Fupgrade-from-0-x-or-a-release-candidate","3.guides\u002F4.run\u002F10.upgrade-from-0-x-or-a-release-candidate",{"title":184,"path":185,"stem":186},"Roll back to 1.4","\u002Fguides\u002Frun\u002Froll-back","3.guides\u002F4.run\u002F11.roll-back",{"title":188,"path":189,"stem":190},"Kraft Lite","\u002Fguides\u002Fkraft-lite","3.guides\u002F5.kraft-lite",{"title":192,"path":193,"stem":194,"children":195,"page":-1},"Troubleshooting","\u002Ftroubleshooting","4.troubleshooting",[196,198,202,206,210,214,218],{"title":10,"path":193,"stem":197},"4.troubleshooting\u002Findex",{"title":199,"path":200,"stem":201},"Why did my item stop?","\u002Ftroubleshooting\u002Fwhy-did-my-item-stop","4.troubleshooting\u002F1.why-did-my-item-stop",{"title":203,"path":204,"stem":205},"Stop reasons in detail","\u002Ftroubleshooting\u002Fstop-reasons-in-detail","4.troubleshooting\u002F2.stop-reasons-in-detail",{"title":207,"path":208,"stem":209},"Starting and reaching Kraft","\u002Ftroubleshooting\u002Fstarting-and-reaching-kraft","4.troubleshooting\u002F3.starting-and-reaching-kraft",{"title":211,"path":212,"stem":213},"Doctor failures","\u002Ftroubleshooting\u002Fdoctor-failures","4.troubleshooting\u002F4.doctor-failures",{"title":215,"path":216,"stem":217},"Sandbox and Kit stops","\u002Ftroubleshooting\u002Fsandbox-and-kit-stops","4.troubleshooting\u002F5.sandbox-and-kit-stops",{"title":219,"path":220,"stem":221},"Add-on problems","\u002Ftroubleshooting\u002Faddon-problems","4.troubleshooting\u002F6.addon-problems",{"title":223,"path":224,"stem":225,"children":226,"page":-1},"Reference","\u002Freference","5.reference",[227,229,267,289,293,391,409,435,439,443,477,481],{"title":10,"path":224,"stem":228},"5.reference\u002Findex",{"title":230,"path":231,"stem":232,"children":233,"page":-1},"Web UI","\u002Freference\u002Fweb-ui","5.reference\u002F00.web-ui\u002Findex",[234,235,239,243,247,251,255,259,263],{"title":10,"path":231,"stem":232},{"title":236,"path":237,"stem":238},"Sidebar, search, and keyboard","\u002Freference\u002Fweb-ui\u002Fsidebar-search-and-keyboard","5.reference\u002F00.web-ui\u002F0.sidebar-search-and-keyboard",{"title":240,"path":241,"stem":242},"The board","\u002Freference\u002Fweb-ui\u002Fboard","5.reference\u002F00.web-ui\u002F1.board",{"title":244,"path":245,"stem":246},"An item's page","\u002Freference\u002Fweb-ui\u002Fitem-page","5.reference\u002F00.web-ui\u002F2.item-page",{"title":248,"path":249,"stem":250},"Fix loops and test scopes","\u002Freference\u002Fweb-ui\u002Ffix-loops-and-test-scopes","5.reference\u002F00.web-ui\u002F3.fix-loops-and-test-scopes",{"title":252,"path":253,"stem":254},"Config before an item starts","\u002Freference\u002Fweb-ui\u002Fconfig-before-start","5.reference\u002F00.web-ui\u002F4.config-before-start",{"title":256,"path":257,"stem":258},"The review page","\u002Freference\u002Fweb-ui\u002Freview-page","5.reference\u002F00.web-ui\u002F5.review-page",{"title":260,"path":261,"stem":262},"Templates and Settings","\u002Freference\u002Fweb-ui\u002Ftemplates-and-settings","5.reference\u002F00.web-ui\u002F6.templates-and-settings",{"title":264,"path":265,"stem":266},"Analytics","\u002Freference\u002Fweb-ui\u002Fanalytics","5.reference\u002F00.web-ui\u002F7.analytics",{"title":268,"path":269,"stem":270,"children":271,"page":-1},"CLI","\u002Freference\u002Fcli","5.reference\u002F01.cli\u002Findex",[272,273,277,281,285],{"title":10,"path":269,"stem":270},{"title":274,"path":275,"stem":276},"Item verbs","\u002Freference\u002Fcli\u002Fitem","5.reference\u002F01.cli\u002F2.item",{"title":278,"path":279,"stem":280},"View verbs","\u002Freference\u002Fcli\u002Fview","5.reference\u002F01.cli\u002F3.view",{"title":282,"path":283,"stem":284},"Repo verbs","\u002Freference\u002Fcli\u002Frepo","5.reference\u002F01.cli\u002F4.repo",{"title":286,"path":287,"stem":288},"Admin verbs","\u002Freference\u002Fcli\u002Fadmin","5.reference\u002F01.cli\u002F5.admin",{"title":290,"path":291,"stem":292},"Work item statuses","\u002Freference\u002Fstatuses","5.reference\u002F02.statuses",{"title":294,"path":295,"stem":296,"children":297,"page":-1},"Configuration","\u002Freference\u002Fconfiguration","5.reference\u002F03.configuration\u002Findex",[298,299,317,321,325,329,333,337,341,345,379,383,387],{"title":10,"path":295,"stem":296},{"title":300,"path":301,"stem":302,"children":303,"page":-1},"repos.yaml","\u002Freference\u002Fconfiguration\u002Frepos","5.reference\u002F03.configuration\u002F02.repos\u002Findex",[304,305,309,313],{"title":10,"path":301,"stem":302},{"title":306,"path":307,"stem":308},"How connect proposes commands","\u002Freference\u002Fconfiguration\u002Frepos\u002Fconnect-proposals","5.reference\u002F03.configuration\u002F02.repos\u002F1.connect-proposals",{"title":310,"path":311,"stem":312},"detectors.yaml","\u002Freference\u002Fconfiguration\u002Frepos\u002Fdetectors","5.reference\u002F03.configuration\u002F02.repos\u002F2.detectors",{"title":314,"path":315,"stem":316},"Workspaces","\u002Freference\u002Fconfiguration\u002Frepos\u002Fworkspaces","5.reference\u002F03.configuration\u002F02.repos\u002F3.workspaces",{"title":318,"path":319,"stem":320},"policy.yaml","\u002Freference\u002Fconfiguration\u002Fpolicy","5.reference\u002F03.configuration\u002F03.policy",{"title":322,"path":323,"stem":324},"Library and chains","\u002Freference\u002Fconfiguration\u002Flibrary-and-chains","5.reference\u002F03.configuration\u002F04.library-and-chains",{"title":326,"path":327,"stem":328},"harnesses.yaml","\u002Freference\u002Fconfiguration\u002Fharnesses-file","5.reference\u002F03.configuration\u002F05.harnesses-file",{"title":330,"path":331,"stem":332},"access.yaml","\u002Freference\u002Fconfiguration\u002Faccess","5.reference\u002F03.configuration\u002F06.access",{"title":334,"path":335,"stem":336},"intake.yaml","\u002Freference\u002Fconfiguration\u002Fintake","5.reference\u002F03.configuration\u002F07.intake",{"title":338,"path":339,"stem":340},"notify.yaml","\u002Freference\u002Fconfiguration\u002Fnotify","5.reference\u002F03.configuration\u002F08.notify",{"title":342,"path":343,"stem":344},"theme.yaml","\u002Freference\u002Fconfiguration\u002Ftheme","5.reference\u002F03.configuration\u002F09.theme",{"title":346,"path":347,"stem":348,"children":349,"page":-1},"Sandboxed workers","\u002Freference\u002Fconfiguration\u002Fsandbox","5.reference\u002F03.configuration\u002F10.sandbox\u002Findex",[350,351,355,359,363,367,371,375],{"title":10,"path":347,"stem":348},{"title":352,"path":353,"stem":354},"Resource limits","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fresource-limits","5.reference\u002F03.configuration\u002F10.sandbox\u002F1.resource-limits",{"title":356,"path":357,"stem":358},"Callbacks from a sandbox","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fcallbacks","5.reference\u002F03.configuration\u002F10.sandbox\u002F2.callbacks",{"title":360,"path":361,"stem":362},"Network policy","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fnetwork-policy","5.reference\u002F03.configuration\u002F10.sandbox\u002F3.network-policy",{"title":364,"path":365,"stem":366},"Credentials","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fcredentials","5.reference\u002F03.configuration\u002F10.sandbox\u002F4.credentials",{"title":368,"path":369,"stem":370},"Kits","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fkits","5.reference\u002F03.configuration\u002F10.sandbox\u002F5.kits",{"title":372,"path":373,"stem":374},"sandbox.yaml","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fsandbox-yaml","5.reference\u002F03.configuration\u002F10.sandbox\u002F6.sandbox-yaml",{"title":376,"path":377,"stem":378},"Git in a sandbox","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fgit-in-a-sandbox","5.reference\u002F03.configuration\u002F10.sandbox\u002F7.git-in-a-sandbox",{"title":380,"path":381,"stem":382},"Environment variables","\u002Freference\u002Fconfiguration\u002Fenvironment-variables","5.reference\u002F03.configuration\u002F11.environment-variables",{"title":384,"path":385,"stem":386},"Add-ons and collections","\u002Freference\u002Fconfiguration\u002Faddons","5.reference\u002F03.configuration\u002F12.addons",{"title":388,"path":389,"stem":390},"Repo libraries","\u002Freference\u002Fconfiguration\u002Frepo-libraries","5.reference\u002F03.configuration\u002F13.repo-libraries",{"title":392,"path":393,"stem":394,"children":395,"page":-1},"Chain file keys","\u002Freference\u002Fchain-nodes","5.reference\u002F04.chain-nodes\u002Findex",[396,397,401,405],{"title":10,"path":393,"stem":394},{"title":398,"path":399,"stem":400},"Subprocess tasks","\u002Freference\u002Fchain-nodes\u002Fsubprocess-tasks","5.reference\u002F04.chain-nodes\u002F2.subprocess-tasks",{"title":402,"path":403,"stem":404},"Fix loop and judge","\u002Freference\u002Fchain-nodes\u002Ffix-loop","5.reference\u002F04.chain-nodes\u002F3.fix-loop",{"title":406,"path":407,"stem":408},"Result file","\u002Freference\u002Fchain-nodes\u002Fresult-file","5.reference\u002F04.chain-nodes\u002F4.result-file",{"title":410,"path":411,"stem":412,"children":413,"page":-1},"Agent harnesses","\u002Freference\u002Fharnesses","5.reference\u002F05.harnesses\u002Findex",[414,415,419,423,427,431],{"title":10,"path":411,"stem":412},{"title":416,"path":417,"stem":418},"Unattended runs","\u002Freference\u002Fharnesses\u002Funattended-runs","5.reference\u002F05.harnesses\u002F2.unattended-runs",{"title":420,"path":421,"stem":422},"Agent profiles","\u002Freference\u002Fharnesses\u002Fagent-profiles","5.reference\u002F05.harnesses\u002F3.agent-profiles",{"title":424,"path":425,"stem":426},"Harness definition files","\u002Freference\u002Fharnesses\u002Fharness-files","5.reference\u002F05.harnesses\u002F4.harness-files",{"title":428,"path":429,"stem":430},"Fallback and escalation","\u002Freference\u002Fharnesses\u002Ffallback-and-escalation","5.reference\u002F05.harnesses\u002F5.fallback-and-escalation",{"title":432,"path":433,"stem":434},"Cost reporting","\u002Freference\u002Fharnesses\u002Fcost-reporting","5.reference\u002F05.harnesses\u002F6.cost-reporting",{"title":436,"path":437,"stem":438},"Permission gate","\u002Freference\u002Fpermissions","5.reference\u002F06.permissions",{"title":440,"path":441,"stem":442},"Inbound triggers","\u002Freference\u002Ftriggers","5.reference\u002F07.triggers",{"title":444,"path":445,"stem":446,"children":447,"page":-1},"HTTP API","\u002Freference\u002Fhttp-api","5.reference\u002F08.http-api\u002Findex",[448,449,453,457,461,465,469,473],{"title":10,"path":445,"stem":446},{"title":450,"path":451,"stem":452},"Filing, reading and changing work items","\u002Freference\u002Fhttp-api\u002Fwork-items","5.reference\u002F08.http-api\u002F2.work-items",{"title":454,"path":455,"stem":456},"Gates, run control, ending and retry","\u002Freference\u002Fhttp-api\u002Fgates-run-control-and-ending","5.reference\u002F08.http-api\u002F3.gates-run-control-and-ending",{"title":458,"path":459,"stem":460},"The work item object","\u002Freference\u002Fhttp-api\u002Fwork-item-object","5.reference\u002F08.http-api\u002F4.work-item-object",{"title":462,"path":463,"stem":464},"Budget, events, diff and documents","\u002Freference\u002Fhttp-api\u002Fbudget-and-events","5.reference\u002F08.http-api\u002F5.budget-and-events",{"title":466,"path":467,"stem":468},"Repos, chains, harnesses and the server","\u002Freference\u002Fhttp-api\u002Frepos-chains-harnesses-and-server","5.reference\u002F08.http-api\u002F6.repos-chains-harnesses-and-server",{"title":470,"path":471,"stem":472},"Drafts","\u002Freference\u002Fhttp-api\u002Fdrafts","5.reference\u002F08.http-api\u002F7.drafts",{"title":474,"path":475,"stem":476},"Ops for each draft area","\u002Freference\u002Fhttp-api\u002Fdraft-ops","5.reference\u002F08.http-api\u002F8.draft-ops",{"title":478,"path":479,"stem":480},"MCP tools","\u002Freference\u002Fmcp-tools","5.reference\u002F09.mcp-tools",{"title":482,"path":483,"stem":484},"Events","\u002Freference\u002Fevents","5.reference\u002F10.events",{"title":486,"path":487,"stem":488,"children":489,"page":-1},"Security and project","\u002Fproject","6.project",[490,492,496,500,504,508,512,516],{"title":10,"path":487,"stem":491},"6.project\u002Findex",{"title":493,"path":494,"stem":495},"Security","\u002Fproject\u002Fsecurity","6.project\u002F1.security",{"title":497,"path":498,"stem":499},"Data and privacy","\u002Fproject\u002Fdata-and-privacy","6.project\u002F2.data-and-privacy",{"title":501,"path":502,"stem":503},"What's new in 2.0","\u002Fproject\u002Fwhats-new","6.project\u002F3.whats-new",{"title":505,"path":506,"stem":507},"Status and support","\u002Fproject\u002Fstatus-and-support","6.project\u002F4.status-and-support",{"title":509,"path":510,"stem":511},"Architecture","\u002Fproject\u002Farchitecture","6.project\u002F5.architecture",{"title":513,"path":514,"stem":515},"Source map","\u002Fproject\u002Fsource-map","6.project\u002F6.source-map",{"title":517,"path":518,"stem":519},"Contributing","\u002Fproject\u002Fcontributing","6.project\u002F7.contributing",{"id":521,"title":131,"body":522,"description":1363,"extension":1364,"links":1365,"meta":1366,"navigation":1367,"path":132,"seo":1368,"stem":133,"__hash__":1369},"docs\u002F3.guides\u002F3.harnesses\u002F3.worker-kit.md",{"type":523,"value":524,"toc":1353},"minimark",[525,553,570,573,578,607,611,632,674,679,691,695,699,709,970,977,1033,1037,1095,1106,1109,1113,1122,1164,1171,1193,1196,1200,1216,1222,1229,1240,1252,1276,1283,1287,1290,1316,1326,1330,1349],[526,527,528,532,533,536,537,540,541,545,546,549,550,552],"p",{},[529,530,531],"strong",{},"Want workers in a plain container, with no Kit?"," Under the repository's entry in ",[534,535,300],"code",{},", set ",[534,538,539],{},"sandbox: {kind: docker, image: \u003Cyour image>, network: \u003Chosts>}","; a sandbox needs a ",[542,543,544],"a",{"href":361},"network policy"," or ",[534,547,548],{},"unrestricted_network: true",". ",[542,551,346],{"href":347}," has the rest of the keys.",[526,554,555,556,560,561,564,565,569],{},"Build a Kit for Claude ",[542,557,559],{"href":558},"\u002Fconcepts\u002Fvocabulary#worker","workers",", push it to your registry, and point a repository at it. A ",[542,562,563],{"href":369},"Kit"," is an image that carries its own ",[542,566,568],{"href":567},"\u002Fconcepts\u002Fvocabulary#sandbox","sandbox"," policy: which hosts its workload may reach, which credentials it holds, and its limits. Kraft publishes no worker image of its own.",[526,571,572],{},"Kraft runs a Kit you build for it. Docker's published Kits require capabilities Kraft does not enforce, so Kraft refuses them.",[574,575,577],"h2",{"id":576},"before-you-start","Before you start",[579,580,581,593,604],"ul",{},[582,583,584,585,588,589,592],"li",{},"Docker with BuildKit (",[534,586,587],{},"docker buildx version"," prints it), logged in to a registry you can push to. Replace ",[534,590,591],{},"registry.example.com\u002Facme"," below with yours.",[582,594,595,596,599,600,603],{},"The machine that runs Kraft logged in to the same registry: Kraft reads the Kit with that machine's ",[534,597,598],{},"docker manifest inspect"," and pulls it with its ",[534,601,602],{},"docker run",".",[582,605,606],{},"An Anthropic API key in the Kraft server's environment.",[574,608,610],{"id":609},"_1-write-the-image","1. Write the image",[526,612,613,614,617,618,621,622,625,626,629,630,603],{},"The image needs the agent CLI on its ",[534,615,616],{},"PATH"," and the minimum every sandboxed image needs: ",[534,619,620],{},"git",", ",[534,623,624],{},"sh",", CA certificates, and ",[534,627,628],{},"curl"," under a network policy. See ",[542,631,346],{"href":347},[633,634,640],"pre",{"className":635,"code":636,"filename":637,"language":638,"meta":639,"style":639},"language-dockerfile shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","FROM docker.io\u002Flibrary\u002Fnode:22-slim\nRUN apt-get update \\\n && apt-get install -y --no-install-recommends bash ca-certificates curl git \\\n && rm -rf \u002Fvar\u002Flib\u002Fapt\u002Flists\u002F*\nRUN npm install -g @anthropic-ai\u002Fclaude-code\n","Dockerfile","dockerfile","",[534,641,642,650,656,662,668],{"__ignoreMap":639},[643,644,647],"span",{"class":645,"line":646},"line",1,[643,648,649],{},"FROM docker.io\u002Flibrary\u002Fnode:22-slim\n",[643,651,653],{"class":645,"line":652},2,[643,654,655],{},"RUN apt-get update \\\n",[643,657,659],{"class":645,"line":658},3,[643,660,661],{}," && apt-get install -y --no-install-recommends bash ca-certificates curl git \\\n",[643,663,665],{"class":645,"line":664},4,[643,666,667],{}," && rm -rf \u002Fvar\u002Flib\u002Fapt\u002Flists\u002F*\n",[643,669,671],{"class":645,"line":670},5,[643,672,673],{},"RUN npm install -g @anthropic-ai\u002Fclaude-code\n",[526,675,676,677,603],{},"Save it as ",[534,678,637],{},[526,680,681,682,685,686,690],{},"The image needs no agent ",[534,683,684],{},"Entrypoint",". Kraft keeps the image's entrypoint and replaces its command with the one the ",[542,687,689],{"href":688},"\u002Fconcepts\u002Fvocabulary#harness","harness"," file builds. A Kit whose entrypoint is the agent itself does not work.",[692,693,694],"note",{},"Kraft mounts each session's result file into the container, so a tool that replaces it by renaming a new file over it would fail. The Claude CLI writes it in place.",[574,696,698],{"id":697},"_2-write-the-descriptor","2. Write the descriptor",[526,700,701,702,705,706,708],{},"Save this as ",[534,703,704],{},"kraft-worker-claude.yaml"," beside the ",[534,707,637],{},":",[633,710,714],{"className":711,"code":712,"filename":704,"language":713,"meta":639,"style":639},"language-yaml shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","# syntax=docker\u002Fsandbox-kit:3\nschemaVersion: \"3\"\nkind: workload\ndisplayName: Kraft claude worker\ndockerfile: Dockerfile\ncapabilities:\n  - type: com.docker.sandbox\u002Fnetwork-policy@1\n    config:\n      runtime:\n        allow: [api.anthropic.com, statsig.anthropic.com]\n  - type: com.docker.sandbox\u002Fcredential@1\n    config:\n      service: anthropic\n      phase: runtime\n      apiKey:\n        name: ANTHROPIC_API_KEY\n        proxyManaged: true\n        inject:\n          - {domain: api.anthropic.com, header: x-api-key}\n  - type: com.docker.sandbox\u002Fresources@1\n    config: {cpu: 2, memory: 2gib}\n","yaml",[534,715,716,722,736,746,756,765,774,788,796,804,824,836,843,854,865,873,884,896,904,930,942],{"__ignoreMap":639},[643,717,718],{"class":645,"line":646},[643,719,721],{"class":720},"sq92B","# syntax=docker\u002Fsandbox-kit:3\n",[643,723,724,728,732],{"class":645,"line":652},[643,725,727],{"class":726},"sb7M8","schemaVersion",[643,729,731],{"class":730},"s7iLA",": ",[643,733,735],{"class":734},"semJd","\"3\"\n",[643,737,738,741,743],{"class":645,"line":658},[643,739,740],{"class":726},"kind",[643,742,731],{"class":730},[643,744,745],{"class":734},"workload\n",[643,747,748,751,753],{"class":645,"line":664},[643,749,750],{"class":726},"displayName",[643,752,731],{"class":730},[643,754,755],{"class":734},"Kraft claude worker\n",[643,757,758,760,762],{"class":645,"line":670},[643,759,638],{"class":726},[643,761,731],{"class":730},[643,763,764],{"class":734},"Dockerfile\n",[643,766,768,771],{"class":645,"line":767},6,[643,769,770],{"class":726},"capabilities",[643,772,773],{"class":730},":\n",[643,775,777,780,783,785],{"class":645,"line":776},7,[643,778,779],{"class":730},"  - ",[643,781,782],{"class":726},"type",[643,784,731],{"class":730},[643,786,787],{"class":734},"com.docker.sandbox\u002Fnetwork-policy@1\n",[643,789,791,794],{"class":645,"line":790},8,[643,792,793],{"class":726},"    config",[643,795,773],{"class":730},[643,797,799,802],{"class":645,"line":798},9,[643,800,801],{"class":726},"      runtime",[643,803,773],{"class":730},[643,805,807,810,813,816,818,821],{"class":645,"line":806},10,[643,808,809],{"class":726},"        allow",[643,811,812],{"class":730},": [",[643,814,815],{"class":734},"api.anthropic.com",[643,817,621],{"class":730},[643,819,820],{"class":734},"statsig.anthropic.com",[643,822,823],{"class":730},"]\n",[643,825,827,829,831,833],{"class":645,"line":826},11,[643,828,779],{"class":730},[643,830,782],{"class":726},[643,832,731],{"class":730},[643,834,835],{"class":734},"com.docker.sandbox\u002Fcredential@1\n",[643,837,839,841],{"class":645,"line":838},12,[643,840,793],{"class":726},[643,842,773],{"class":730},[643,844,846,849,851],{"class":645,"line":845},13,[643,847,848],{"class":726},"      service",[643,850,731],{"class":730},[643,852,853],{"class":734},"anthropic\n",[643,855,857,860,862],{"class":645,"line":856},14,[643,858,859],{"class":726},"      phase",[643,861,731],{"class":730},[643,863,864],{"class":734},"runtime\n",[643,866,868,871],{"class":645,"line":867},15,[643,869,870],{"class":726},"      apiKey",[643,872,773],{"class":730},[643,874,876,879,881],{"class":645,"line":875},16,[643,877,878],{"class":726},"        name",[643,880,731],{"class":730},[643,882,883],{"class":734},"ANTHROPIC_API_KEY\n",[643,885,887,890,892],{"class":645,"line":886},17,[643,888,889],{"class":726},"        proxyManaged",[643,891,731],{"class":730},[643,893,895],{"class":894},"ssYy9","true\n",[643,897,899,902],{"class":645,"line":898},18,[643,900,901],{"class":726},"        inject",[643,903,773],{"class":730},[643,905,907,910,913,915,917,919,922,924,927],{"class":645,"line":906},19,[643,908,909],{"class":730},"          - {",[643,911,912],{"class":726},"domain",[643,914,731],{"class":730},[643,916,815],{"class":734},[643,918,621],{"class":730},[643,920,921],{"class":726},"header",[643,923,731],{"class":730},[643,925,926],{"class":734},"x-api-key",[643,928,929],{"class":730},"}\n",[643,931,933,935,937,939],{"class":645,"line":932},20,[643,934,779],{"class":730},[643,936,782],{"class":726},[643,938,731],{"class":730},[643,940,941],{"class":734},"com.docker.sandbox\u002Fresources@1\n",[643,943,945,947,950,953,955,958,960,963,965,968],{"class":645,"line":944},21,[643,946,793],{"class":726},[643,948,949],{"class":730},": {",[643,951,952],{"class":726},"cpu",[643,954,731],{"class":730},[643,956,957],{"class":894},"2",[643,959,621],{"class":730},[643,961,962],{"class":726},"memory",[643,964,731],{"class":730},[643,966,967],{"class":734},"2gib",[643,969,929],{"class":730},[526,971,972,973,976],{},"Two of these capabilities need something from you: the Kit has no ",[534,974,975],{},"install"," phase, and a Kit for Claude lists Claude's own hosts itself. What each capability becomes in Kraft:",[579,978,979,1003,1025],{},[582,980,981,986,987,989,990,992,993,995,996,999,1000,1002],{},[529,982,983],{},[534,984,985],{},"network-policy@1",": the sessions reach ",[534,988,815],{}," and ",[534,991,820],{}," and nothing else. There is no ",[534,994,975],{}," phase, so the repository's ",[534,997,998],{},"setup_command"," reaches nothing: build what setup needs into the image, or add an ",[534,1001,975],{}," allow list. Kraft does not add the Claude harness's own hosts under a Kit, so a Kit for Claude lists them itself.",[582,1004,1005,1010,1011,1014,1015,1017,1018,1020,1021,1024],{},[529,1006,1007],{},[534,1008,1009],{},"credential@1",": the container sees ",[534,1012,1013],{},"ANTHROPIC_API_KEY"," only as a placeholder. Kraft's egress proxy, the proxy that carries a sandboxed session's outbound traffic, adds the real key to the ",[534,1016,926],{}," header on requests to ",[534,1019,815],{},". The value comes from the server variable you bind to the ",[534,1022,1023],{},"anthropic"," service in step 4.",[582,1026,1027,1032],{},[529,1028,1029],{},[534,1030,1031],{},"resources@1",": two CPUs and a 2 GiB memory limit on every session.",[574,1034,1036],{"id":1035},"_3-build-push-and-pin-it","3. Build, push and pin it",[633,1038,1042],{"className":1039,"code":1040,"language":1041,"meta":639,"style":639},"language-bash shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","docker buildx build -f kraft-worker-claude.yaml \\\n  -t registry.example.com\u002Facme\u002Fkraft-worker-claude:1 --push .\ndocker buildx imagetools inspect registry.example.com\u002Facme\u002Fkraft-worker-claude:1\n","bash",[534,1043,1044,1066,1080],{"__ignoreMap":639},[643,1045,1046,1050,1053,1056,1059,1062],{"class":645,"line":646},[643,1047,1049],{"class":1048},"szw1H","docker",[643,1051,1052],{"class":734}," buildx",[643,1054,1055],{"class":734}," build",[643,1057,1058],{"class":894}," -f",[643,1060,1061],{"class":734}," kraft-worker-claude.yaml",[643,1063,1065],{"class":1064},"sklAV"," \\\n",[643,1067,1068,1071,1074,1077],{"class":645,"line":652},[643,1069,1070],{"class":894},"  -t",[643,1072,1073],{"class":734}," registry.example.com\u002Facme\u002Fkraft-worker-claude:1",[643,1075,1076],{"class":894}," --push",[643,1078,1079],{"class":734}," .\n",[643,1081,1082,1084,1086,1089,1092],{"class":645,"line":658},[643,1083,1049],{"class":1048},[643,1085,1052],{"class":734},[643,1087,1088],{"class":734}," imagetools",[643,1090,1091],{"class":734}," inspect",[643,1093,1094],{"class":734}," registry.example.com\u002Facme\u002Fkraft-worker-claude:1\n",[526,1096,1097,1098,1101,1102,1105],{},"The ",[534,1099,1100],{},"# syntax=docker\u002Fsandbox-kit:3"," line makes BuildKit build it with the Kit frontend, which puts the descriptor on the image's manifest. The second command prints the digest (",[534,1103,1104],{},"Digest: sha256:...",").",[526,1107,1108],{},"Pin the Kit by that digest. Kraft refuses a Kit named by tag alone, because a tag can point at a different Kit tomorrow.",[574,1110,1112],{"id":1111},"_4-point-a-repository-at-it","4. Point a repository at it",[526,1114,1115,1116,1121],{},"In ",[542,1117,1119],{"href":1118},"\u002Freference\u002Fconfiguration\u002Frepos#sandbox",[534,1120,300],{},", under the repository's entry:",[633,1123,1126],{"className":711,"code":1124,"filename":1125,"language":713,"meta":639,"style":639},"sandbox:\n  kind: kit\n  runtime: docker\n  kit: registry.example.com\u002Facme\u002Fkraft-worker-claude:1@sha256:\u003Cthe digest>\n","config\u002Frepos.yaml",[534,1127,1128,1134,1144,1154],{"__ignoreMap":639},[643,1129,1130,1132],{"class":645,"line":646},[643,1131,568],{"class":726},[643,1133,773],{"class":730},[643,1135,1136,1139,1141],{"class":645,"line":652},[643,1137,1138],{"class":726},"  kind",[643,1140,731],{"class":730},[643,1142,1143],{"class":734},"kit\n",[643,1145,1146,1149,1151],{"class":645,"line":658},[643,1147,1148],{"class":726},"  runtime",[643,1150,731],{"class":730},[643,1152,1153],{"class":734},"docker\n",[643,1155,1156,1159,1161],{"class":645,"line":664},[643,1157,1158],{"class":726},"  kit",[643,1160,731],{"class":730},[643,1162,1163],{"class":734},"registry.example.com\u002Facme\u002Fkraft-worker-claude:1@sha256:\u003Cthe digest>\n",[526,1165,1115,1166,1170],{},[542,1167,1168],{"href":373},[534,1169,372],{},", bind the credential's service to the server variable holding the key:",[633,1172,1175],{"className":711,"code":1173,"filename":1174,"language":713,"meta":639,"style":639},"credentials:\n  anthropic: ANTHROPIC_API_KEY\n","config\u002Fsandbox.yaml",[534,1176,1177,1184],{"__ignoreMap":639},[643,1178,1179,1182],{"class":645,"line":646},[643,1180,1181],{"class":726},"credentials",[643,1183,773],{"class":730},[643,1185,1186,1189,1191],{"class":645,"line":652},[643,1187,1188],{"class":726},"  anthropic",[643,1190,731],{"class":730},[643,1192,883],{"class":734},[526,1194,1195],{},"The right-hand side is a variable in the Kraft server's environment. It can have any name.",[574,1197,1199],{"id":1198},"check-it-worked","Check it worked",[633,1201,1203],{"className":1039,"code":1202,"language":1041,"meta":639,"style":639},"kraft admin doctor\n",[534,1204,1205],{"__ignoreMap":639},[643,1206,1207,1210,1213],{"class":645,"line":646},[643,1208,1209],{"class":1048},"kraft",[643,1211,1212],{"class":734}," admin",[643,1214,1215],{"class":734}," doctor\n",[526,1217,1218,1219,1221],{},"The repository's ",[534,1220,568],{}," row reads and checks the Kit. If the Kit is refused, that row fails and names the Kit and why.",[526,1223,1224,1225,1228],{},"A ",[534,1226,1227],{},"kit hosts"," row is a warning, and it is expected: this Kit is for Claude, and sessions of other harnesses under it are refused their hosts. It reads:",[633,1230,1235],{"className":1231,"code":1233,"language":1234,"meta":639},[1232],"language-text","warn  kit hosts \u003Crepo>  the Kit does not allow what these harnesses need, so their sessions are refused it: amp requires ampcode.com; codex requires api.openai.com, chatgpt.com; gemini requires generativelanguage.googleapis.com\n","text",[534,1236,1237],{"__ignoreMap":639},[643,1238,1233],{"className":1239},[645],[526,1241,1242,1243,1247,1248,1251],{},"Then file a ",[542,1244,1246],{"href":1245},"\u002Fconcepts\u002Fvocabulary#work-item","work item"," on the repository. Its first task records a ",[534,1249,1250],{},"sandbox_kit_resolved"," event:",[633,1253,1255],{"className":1039,"code":1254,"language":1041,"meta":639,"style":639},"kraft view events ID --type sandbox_kit_resolved\n",[534,1256,1257],{"__ignoreMap":639},[643,1258,1259,1261,1264,1267,1270,1273],{"class":645,"line":646},[643,1260,1209],{"class":1048},[643,1262,1263],{"class":734}," view",[643,1265,1266],{"class":734}," events",[643,1268,1269],{"class":734}," ID",[643,1271,1272],{"class":894}," --type",[643,1274,1275],{"class":734}," sandbox_kit_resolved\n",[526,1277,1278,1279,603],{},"If the item stops instead, see ",[542,1280,1282],{"href":1281},"\u002Ftroubleshooting\u002Fsandbox-and-kit-stops#a-kit-is-refused","A Kit is refused",[574,1284,1286],{"id":1285},"change-the-kit","Change the Kit",[526,1288,1289],{},"A rebuilt Kit has a new digest, and an item filed before the change keeps the sandbox it was filed with.",[1291,1292,1293,1296,1303],"ol",{},[582,1294,1295],{},"Rebuild and push, as in step 3.",[582,1297,1298,1299,1302],{},"Copy the new digest from the ",[534,1300,1301],{},"imagetools inspect"," output.",[582,1304,1305,1306,1309,1310,1313,1314,603],{},"Put it in ",[534,1307,1308],{},"kit:"," under the repository's ",[534,1311,1312],{},"sandbox:"," in ",[534,1315,300],{},[526,1317,1318,1319,1321,1322,1325],{},"Kraft rereads ",[534,1320,300],{}," when an item is filed, so no ",[534,1323,1324],{},"kraft admin reload"," is needed.",[574,1327,1329],{"id":1328},"next-steps","Next steps",[579,1331,1332,1337,1344],{},[582,1333,1334,1336],{},[542,1335,368],{"href":369},": every field a Kit sandbox accepts.",[582,1338,1339,1343],{},[542,1340,1341],{"href":373},[534,1342,372],{},": bind credentials to server variables.",[582,1345,1346,1348],{},[542,1347,1282],{"href":1281},": the stop reasons for a Kit Kraft will not run.",[1350,1351,1352],"style",{},"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 .sq92B, html code.shiki .sq92B{--shiki-light:#66707B;--shiki-default:#66707B;--shiki-dark:#BDC4CC}html pre.shiki code .sb7M8, html code.shiki .sb7M8{--shiki-light:#024C1A;--shiki-default:#024C1A;--shiki-dark:#72F088}html pre.shiki code .s7iLA, html code.shiki .s7iLA{--shiki-light:#0E1116;--shiki-default:#0E1116;--shiki-dark:#F0F3F6}html pre.shiki code .semJd, html code.shiki .semJd{--shiki-light:#032563;--shiki-default:#032563;--shiki-dark:#ADDCFF}html pre.shiki code .ssYy9, html code.shiki .ssYy9{--shiki-light:#023B95;--shiki-default:#023B95;--shiki-dark:#91CBFF}html pre.shiki code .szw1H, html code.shiki .szw1H{--shiki-light:#702C00;--shiki-default:#702C00;--shiki-dark:#FFB757}html pre.shiki code .sklAV, html code.shiki .sklAV{--shiki-light:#A0111F;--shiki-default:#A0111F;--shiki-dark:#FF9492}",{"title":639,"searchDepth":652,"depth":652,"links":1354},[1355,1356,1357,1358,1359,1360,1361,1362],{"id":576,"depth":652,"text":577},{"id":609,"depth":652,"text":610},{"id":697,"depth":652,"text":698},{"id":1035,"depth":652,"text":1036},{"id":1111,"depth":652,"text":1112},{"id":1198,"depth":652,"text":1199},{"id":1285,"depth":652,"text":1286},{"id":1328,"depth":652,"text":1329},"Build a Docker Sandbox Kit for Kraft's Claude workers, push it to your registry, and run a repository's sandbox from it, pinned by digest.","md",null,{},true,{"title":131,"description":1363},"uMyOYWArjEg3jbxbnsySW6lceSPL3CO8PN5MtsgKw7E",[1371,1373],{"title":127,"path":128,"stem":129,"description":1372,"children":-1},"Add an agent CLI to Kraft with a YAML file, and override a shipped one.",{"title":135,"path":136,"stem":137,"description":1374,"children":-1},"Give the agent CLI a worker runs on, whether Claude Code, Codex, Cursor, OpenCode, Amp, Antigravity or Gemini CLI, a login it can use headless, and check that the worker reaches it.",1791801162310]