[{"data":1,"prerenderedAt":1341},["ShallowReactive",2],{"navigation_docs":3,"-reference-configuration-sandbox-sandbox-yaml":520,"-reference-configuration-sandbox-sandbox-yaml-surround":1336},[4,28,51,191,222,485],{"title":5,"path":6,"stem":7,"children":8},"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},"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},"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},"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},"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},"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},"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},"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},"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},"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},"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},"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},"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},"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":372,"body":522,"description":1329,"extension":1330,"links":1331,"meta":1332,"navigation":1333,"path":373,"seo":1334,"stem":374,"__hash__":1335},"docs\u002F5.reference\u002F03.configuration\u002F10.sandbox\u002F6.sandbox-yaml.md",{"type":523,"value":524,"toc":1306},"minimark",[525,550,599,602,783,788,793,796,850,855,859,866,870,873,880,884,890,894,897,946,950,956,959,985,998,1002,1019,1022,1029,1033,1039,1042,1060,1078,1085,1126,1133,1139,1145,1157,1161,1167,1181,1186,1196,1200,1207,1211,1230,1254,1259,1265,1272,1276,1302],[526,527,528,531,532,537,538,541,542,545,546,549],"p",{},[529,530,372],"code",{}," says how this machine runs ",[533,534,536],"a",{"href":535},"\u002Fconcepts\u002Fvocabulary#sandbox","sandboxed"," tasks: the container CLI, SELinux, an extra CA and the proxy. Whether a task is sandboxed, and in which image, is set elsewhere: ",[529,539,540],{},"sandbox:"," in ",[533,543,300],{"href":544},"\u002Freference\u002Fconfiguration\u002Frepos#sandbox"," or a ",[533,547,548],{"href":319},"policy",".",[551,552,558],"pre",{"className":553,"code":554,"filename":555,"language":556,"meta":557,"style":557},"language-yaml shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","cli: docker\nselinux: auto\nca_bundle: \u002Fetc\u002Fssl\u002Fcorp-ca.pem\n","config\u002Fsandbox.yaml","yaml","",[529,559,560,577,588],{"__ignoreMap":557},[561,562,565,569,573],"span",{"class":563,"line":564},"line",1,[561,566,568],{"class":567},"sb7M8","cli",[561,570,572],{"class":571},"s7iLA",": ",[561,574,576],{"class":575},"semJd","docker\n",[561,578,580,583,585],{"class":563,"line":579},2,[561,581,582],{"class":567},"selinux",[561,584,572],{"class":571},[561,586,587],{"class":575},"auto\n",[561,589,591,594,596],{"class":563,"line":590},3,[561,592,593],{"class":567},"ca_bundle",[561,595,572],{"class":571},[561,597,598],{"class":575},"\u002Fetc\u002Fssl\u002Fcorp-ca.pem\n",[526,600,601],{},"The file is optional. A missing one is all defaults, which suit a machine with Docker and no SELinux.",[603,604,605,624],"table",{},[606,607,608],"thead",{},[609,610,611,615,618,621],"tr",{},[612,613,614],"th",{},"Field",[612,616,617],{},"Type",[612,619,620],{},"Default",[612,622,623],{},"Meaning",[625,626,627,670,698,720,751],"tbody",{},[609,628,629,634,643,646],{},[630,631,632],"td",{},[529,633,568],{},[630,635,636,639,640],{},[529,637,638],{},"docker"," or ",[529,641,642],{},"podman",[630,644,645],{},"unset",[630,647,648,649,651,652,655,656,658,659,661,662,665,666,669],{},"The container CLI. Unset: ",[529,650,638],{}," when it is on ",[529,653,654],{},"PATH",", otherwise ",[529,657,642],{},". A ",[529,660,638],{}," that is Podman underneath (the ",[529,663,664],{},"podman-docker"," package) is recognized from its ",[529,667,668],{},"--version"," and treated as Podman.",[609,671,672,676,688,692],{},[630,673,674],{},[529,675,582],{},[630,677,678,681,682,639,685],{},[529,679,680],{},"relabel",", ",[529,683,684],{},"disable",[529,686,687],{},"auto",[630,689,690],{},[529,691,687],{},[630,693,694,695,549],{},"What to do on a host where SELinux enforces, which denies every bind mount a container did not relabel. See ",[533,696,582],{"href":697},"#selinux",[609,699,700,704,707,709],{},[630,701,702],{},[529,703,593],{},[630,705,706],{},"string, an absolute path",[630,708,645],{},[630,710,711,712,715,716,549],{},"A PEM file of extra root certificates a sandboxed task trusts, such as your TLS-intercepting proxy's CA. See ",[533,713,593],{"href":714},"#ca_bundle"," and ",[533,717,719],{"href":718},"#ca-certificates","CA certificates",[609,721,722,727,730,736],{},[630,723,724],{},[529,725,726],{},"relay_image",[630,728,729],{},"string, an image reference",[630,731,732,735],{},[529,733,734],{},"docker.io\u002Falpine\u002Fsocat@sha256:5ffbd6ae…"," (socat 1.8.1.3, pinned by digest)",[630,737,738,739,742,743,747,748,549],{},"The image of the relay container a sandboxed session under a ",[529,740,741],{},"network"," policy runs beside its ",[533,744,746],{"href":745},"\u002Fconcepts\u002Fvocabulary#worker","worker",". See ",[533,749,726],{"href":750},"#relay_image",[609,752,753,758,761,766],{},[630,754,755],{},[529,756,757],{},"credentials",[630,759,760],{},"mapping of string to string",[630,762,763],{},[529,764,765],{},"{}",[630,767,768,769,772,773,776,777,747,780,549],{},"For a ",[533,770,771],{"href":369},"Kit","'s credentials: each credential@1 ",[529,774,775],{},"service"," mapped to the name of the server's own environment variable holding its value, as ",[529,778,779],{},"anthropic: KRAFT_ANTHROPIC_KEY",[533,781,757],{"href":782},"#credentials",[784,785,787],"h2",{"id":786},"field-details","Field details",[789,790,791],"h3",{"id":582},[529,792,582],{},[526,794,795],{},"On a host where SELinux enforces, every bind mount a container did not relabel is denied. The three values:",[603,797,798,808],{},[606,799,800],{},[609,801,802,805],{},[612,803,804],{},"Value",[612,806,807],{},"What it does",[625,809,810,828,841],{},[609,811,812,816],{},[630,813,814],{},[529,815,680],{},[630,817,818,819,822,823,827],{},"Adds the shared ",[529,820,821],{},"z"," label to each mount, which relabels the ",[533,824,826],{"href":825},"\u002Fconcepts\u002Fvocabulary#worktree","worktree"," and your repository's files for containers once.",[609,829,830,834],{},[630,831,832],{},[529,833,684],{},[630,835,836,837,840],{},"Runs Kraft's containers with ",[529,838,839],{},"--security-opt label=disable",", leaving the files alone and SELinux separation off for those containers only.",[609,842,843,847],{},[630,844,845],{},[529,846,687],{},[630,848,849],{},"Stops each sandboxed task as a configuration error that names both, because either one changes something outside Kraft.",[526,851,852,854],{},[529,853,582],{}," is ignored where SELinux is off or permissive, and where the runtime applies no labels (Docker does only when its daemon runs with SELinux support), since its mounts then work as they are.",[789,856,857],{"id":593},[529,858,593],{},[526,860,861,862,865],{},"Unset: the server's ",[529,863,864],{},"SSL_CERT_FILE",", when it has one and it is usable. One that cannot be used stops each sandboxed task.",[789,867,868],{"id":726},[529,869,726],{},[526,871,872],{},"The relay container has no network of its own and forwards the worker's proxy port to Kraft. On Docker Desktop and Podman machine it is also the image of the second relay of each session.",[526,874,875,876,879],{},"Set it to use a mirror or your own socat image. ",[529,877,878],{},"kraft admin doctor"," fails when it is not pulled; pull it before filing work.",[789,881,882],{"id":757},[529,883,757],{},[526,885,886,887,889],{},"A Kit never picks a host variable itself, and its credential is read from nothing else. A required credential with no binding stops each item under the Kit, naming the binding to add. An optional one is skipped, and ",[529,888,878],{}," warns about it.",[784,891,893],{"id":892},"container-user","Container user",[526,895,896],{},"Kraft asks the runtime whether it is rootless, and runs the container so that what the worker writes stays yours:",[603,898,899,909],{},[606,900,901],{},[609,902,903,906],{},[612,904,905],{},"Runtime",[612,907,908],{},"Runs the container as",[625,910,911,919,927,934],{},[609,912,913,916],{},[630,914,915],{},"Docker",[630,917,918],{},"Your uid and gid.",[609,920,921,924],{},[630,922,923],{},"Rootless Docker",[630,925,926],{},"Container root, which rootless Docker maps to you. Any other uid would land in your subordinate range, and you could not edit what it wrote. Capabilities stay dropped.",[609,928,929,932],{},[630,930,931],{},"Podman",[630,933,918],{},[609,935,936,939],{},[630,937,938],{},"Rootless Podman",[630,940,941,942,945],{},"Your uid and gid, with ",[529,943,944],{},"--userns=keep-id",": without it your uid does not exist in the container, and the worktree is not writable.",[789,947,949],{"id":948},"a-runtime-that-does-not-answer","A runtime that does not answer",[526,951,952,953,955],{},"A runtime that does not answer is never taken for a rootful one: a launch that gets no answer stops as a configuration error that says so. ",[529,954,878],{}," asks the same way, once per run however many repositories are sandboxed. It says when it is waiting for the second answer, and it can take about a minute when the runtime does not answer.",[526,957,958],{},"The timings and the threads behind that, all in one place:",[960,961,962,970,973,976,979,982],"ul",{},[963,964,965,966,969],"li",{},"Its ",[529,967,968],{},"info"," can be slow: a rootless Podman's first one on a busy host has taken over ten seconds, Kraft's first wait.",[963,971,972],{},"After that, the next launch asks once more and waits up to 30 seconds. Any launch that starts meanwhile waits for that answer.",[963,974,975],{},"If there is still no answer, the launch stops. Launches in the 30 seconds after that stop the same way without asking, and then Kraft asks again.",[963,977,978],{},"A launch asks these questions from a worker thread. The rest of Kraft reads the last answer, and a question that is due again is asked in the background, so the server never stalls waiting for one.",[963,980,981],{},"An answer Kraft already has is kept: a later ask that gets none does not replace it.",[963,983,984],{},"The one exception is rootless Docker, whose container root would be real root if Docker's daemon has since become rootful. The next launch asks again, as above, and stops if there is still no answer.",[526,986,987,988,991,992,995,996,549],{},"To see how long your runtime takes, run ",[529,989,990],{},"time podman info"," (or ",[529,993,994],{},"time docker info","), then ",[529,997,878],{},[789,999,1001],{"id":1000},"ownership-and-limits","Ownership and limits",[526,1003,1004,1005,1009,1010,1014,1015,1018],{},"On a rootless runtime, a task stops as a configuration error before it starts if the ",[533,1006,1008],{"href":1007},"\u002Fconcepts\u002Fvocabulary#work-item","work item","'s sandbox HOME, its ",[533,1011,1013],{"href":1012},"\u002Fconcepts\u002Fvocabulary#ref-store","ref store"," or its result file belongs to another user, as one can after switching runtimes. The message names the path: ",[529,1016,1017],{},"chown"," it back to yourself, or remove it.",[526,1020,1021],{},"A workspace item has one ref store for each repository, its members' and its root's, and each is checked the same way.",[526,1023,1024,1025,1028],{},"Kraft also asks the runtime which ",[533,1026,1027],{"href":353},"resource limits"," it can enforce: a task that sets one it cannot stops as a configuration error rather than running without it.",[784,1030,1032],{"id":1031},"when-the-file-is-read","When the file is read",[526,1034,1035,1036,1038],{},"Kraft reads the file and asks the runtime once, at the first sandboxed launch after it starts. ",[529,1037,878],{}," reads both again, so run it after editing the file. Restart Kraft for running tasks to pick the change up.",[784,1040,719],{"id":1041},"ca-certificates",[526,1043,1044,1045,639,1047,1049,1050,1052,1053,1055,1056,1059],{},"A container does not have the files the server's ",[529,1046,864],{},[529,1048,593],{}," name, so Kraft never forwards those paths. When there is an extra CA, ",[529,1051,593],{}," or else the server's ",[529,1054,864],{},", Kraft builds one bundle per image under ",[529,1057,1058],{},"$KRAFT_HOME\u002Frun\u002Fsandbox-ca\u002F",":",[960,1061,1062,1075],{},[963,1063,1064,1065,681,1068,715,1071,1074],{},"the image's own roots, read once per image id by a container with no network, from the first of ",[529,1066,1067],{},"\u002Fetc\u002Fssl\u002Fcerts\u002Fca-certificates.crt",[529,1069,1070],{},"\u002Fetc\u002Fpki\u002Ftls\u002Fcerts\u002Fca-bundle.crt",[529,1072,1073],{},"\u002Fetc\u002Fssl\u002Fcert.pem"," it holds (none: the extra CA alone);",[963,1076,1077],{},"then every certificate in the extra CA.",[526,1079,1080,1081,1084],{},"The bundle is mounted read-only at ",[529,1082,1083],{},"\u002Fetc\u002Fkraft\u002Fca-bundle.pem",", for sessions and the setup command alike. These variables all name it:",[960,1086,1087,1091,1096,1101,1106,1111,1116,1121],{},[963,1088,1089],{},[529,1090,864],{},[963,1092,1093],{},[529,1094,1095],{},"REQUESTS_CA_BUNDLE",[963,1097,1098],{},[529,1099,1100],{},"CURL_CA_BUNDLE",[963,1102,1103],{},[529,1104,1105],{},"GIT_SSL_CAINFO",[963,1107,1108],{},[529,1109,1110],{},"NODE_EXTRA_CA_CERTS",[963,1112,1113],{},[529,1114,1115],{},"CODEX_CA_CERTIFICATE",[963,1117,1118],{},[529,1119,1120],{},"PIP_CERT",[963,1122,1123],{},[529,1124,1125],{},"npm_config_cafile",[526,1127,1128,1129,1132],{},"The bundle holds the image's roots too, because most of those variables replace a tool's store rather than add to it. A repository's own ",[529,1130,1131],{},"env"," still wins over any of them.",[526,1134,1135,1136,1138],{},"The extra CA is read at every launch, so an edit to ",[529,1137,593],{}," or to the file needs no restart. With no extra CA, no bundle is built and nothing is mounted or set.",[789,1140,1142,1144],{"id":1141},"ssl_cert_file-counts",[529,1143,864],{}," counts",[526,1146,1147,1148,1150,1151,1153,1154,1156],{},"When ",[529,1149,593],{}," is unset and the server has ",[529,1152,864],{},", that file is the extra CA, so every sandboxed launch on such a host builds and mounts a bundle. Set ",[529,1155,593],{}," to choose a different file.",[789,1158,1160],{"id":1159},"an-unusable-ca","An unusable CA",[526,1162,1163,1164,1166],{},"A ",[529,1165,593],{}," stops every sandboxed task as a configuration error when it:",[960,1168,1169,1172,1175,1178],{},[963,1170,1171],{},"cannot be read",[963,1173,1174],{},"is a directory",[963,1176,1177],{},"is not an absolute path",[963,1179,1180],{},"holds no PEM certificate",[526,1182,1183,1185],{},[529,1184,878],{}," also fails the repository's sandbox row: you named it for sandboxes, so it is never skipped.",[526,1187,1188,1189,1191,1192,1195],{},"An unusable ",[529,1190,864],{}," is ignored instead, since it was not set for sandboxes. Tasks launch as they would without it, and doctor shows a ",[529,1193,1194],{},"ca"," warning saying why it was not used.",[789,1197,1199],{"id":1198},"an-image-whose-roots-cannot-be-read","An image whose roots cannot be read",[526,1201,1202,1203,1206],{},"The container that reads the image's roots may not run: the pull failed or timed out, the image has no ",[529,1204,1205],{},"sh",", or the runtime did not answer. The task then stops as a configuration error naming the image, because a bundle of the extra CA alone would replace the store and fail TLS to every other host. Nothing is cached, so the next launch tries again.",[784,1208,1210],{"id":1209},"proxy","Proxy",[526,1212,1213,1214,681,1217,681,1220,681,1223,1226,1227,1229],{},"The server's proxy variables (",[529,1215,1216],{},"HTTP_PROXY",[529,1218,1219],{},"HTTPS_PROXY",[529,1221,1222],{},"ALL_PROXY",[529,1224,1225],{},"NO_PROXY",", in either case) reach a sandboxed task by name, so a proxy password never appears on the ",[529,1228,638],{}," command line.",[526,1231,1232,1233,681,1236,681,1239,1242,1243,1246,1247,639,1250,1253],{},"A proxy on the server's loopback is left out. That means ",[529,1234,1235],{},"127.0.0.0\u002F8",[529,1237,1238],{},"::1",[529,1240,1241],{},"localhost"," or any ",[529,1244,1245],{},"*.localhost"," name, or the unspecified address ",[529,1248,1249],{},"0.0.0.0",[529,1251,1252],{},"::",". Inside the container that address is the container itself, so forwarding it would fail every request. Leaving it out at least lets the task go direct where the host allows that.",[526,1255,1256,1258],{},[529,1257,878],{}," warns about such a proxy for each sandboxed repository.",[526,1260,1261,1262,1264],{},"Doctor's proxy and CA checks read the environment of the ",[529,1263,878],{}," process itself, not the running server's. They agree when both were started from the same shell. If the server runs as a service with its own environment, check that environment instead.",[526,1266,1267,1268,1271],{},"Under a sandbox ",[533,1269,1270],{"href":361},"network policy"," none of these variables is forwarded, and doctor does not warn. The container's only proxy is Kraft's own, and the server makes the outbound connections through its own proxy, on its loopback or not.",[784,1273,1275],{"id":1274},"related","Related",[960,1277,1278,1287,1295],{},[963,1279,1280,1282,1283,1286],{},[533,1281,346],{"href":347},": what else reaches the container, and the ",[529,1284,1285],{},"sandbox"," key.",[963,1288,1289,1291,1292,1294],{},[533,1290,360],{"href":361},": the relay ",[529,1293,726],{}," runs, and the proxy a policy replaces.",[963,1296,1297,572,1299,1301],{},[533,1298,380],{"href":381},[529,1300,864],{}," among the variables Kraft reads.",[1303,1304,1305],"style",{},"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 .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);}",{"title":557,"searchDepth":579,"depth":579,"links":1307},[1308,1316,1320,1321,1327,1328],{"id":786,"depth":579,"text":787,"children":1309},[1310,1311,1313,1315],{"id":582,"depth":590,"text":582},{"id":593,"depth":590,"text":1312},"ca_​bundle",{"id":726,"depth":590,"text":1314},"relay_​image",{"id":757,"depth":590,"text":757},{"id":892,"depth":579,"text":893,"children":1317},[1318,1319],{"id":948,"depth":590,"text":949},{"id":1000,"depth":590,"text":1001},{"id":1031,"depth":579,"text":1032},{"id":1041,"depth":579,"text":719,"children":1322},[1323,1325,1326],{"id":1141,"depth":590,"text":1324},"SSL_​CERT_​FILE counts",{"id":1159,"depth":590,"text":1160},{"id":1198,"depth":590,"text":1199},{"id":1209,"depth":579,"text":1210},{"id":1274,"depth":579,"text":1275},"Every field in sandbox.yaml: which container CLI runs sandboxed tasks, how they get past SELinux, and which extra CA they trust.","md",null,{},true,{"title":372,"description":1329},"3KLdrZlVWe8fQN9hz_GbpcW4maULqqVxiGmrXDJDMFw",[1337,1339],{"title":368,"path":369,"stem":370,"description":1338,"children":-1},"How to declare a Kit as a repository's sandbox, and what Kraft enforces, reads and refuses.",{"title":376,"path":377,"stem":378,"description":1340,"children":-1},"How a sandboxed worker's repository refs, workspace members and worktree are handled, and what Kraft's own git does and does not do there.",1791801181063]