[{"data":1,"prerenderedAt":1224},["ShallowReactive",2],{"navigation_docs":3,"-guides-run-run-a-step-on-another-machine":571,"-guides-run-run-a-step-on-another-machine-surround":1219},[4,32,59,214,245,536],{"title":5,"path":6,"stem":7,"children":8},"Get started","\u002Fget-started","1.get-started",[9,12,16,20,24,28],{"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},"The real chain","\u002Fget-started\u002Fthe-real-chain","1.get-started\u002F3.the-real-chain",{"title":29,"path":30,"stem":31},"FAQ","\u002Fget-started\u002Ffaq","1.get-started\u002F4.faq",{"title":33,"path":34,"stem":35,"children":36},"Concepts","\u002Fconcepts","2.concepts",[37,39,43,47,51,55],{"title":10,"path":34,"stem":38},"2.concepts\u002Findex",{"title":40,"path":41,"stem":42},"How a work item runs","\u002Fconcepts\u002Fhow-a-work-item-runs","2.concepts\u002F1.how-a-work-item-runs",{"title":44,"path":45,"stem":46},"Caps and budgets","\u002Fconcepts\u002Fcaps-and-budgets","2.concepts\u002F2.caps-and-budgets",{"title":48,"path":49,"stem":50},"Why a permission gate","\u002Fconcepts\u002Fpermission-gate","2.concepts\u002F3.permission-gate",{"title":52,"path":53,"stem":54},"Vocabulary","\u002Fconcepts\u002Fvocabulary","2.concepts\u002F4.vocabulary",{"title":56,"path":57,"stem":58},"Where a step runs","\u002Fconcepts\u002Fwhere-a-step-runs","2.concepts\u002F5.where-a-step-runs",{"title":60,"path":61,"stem":62,"children":63},"Guides","\u002Fguides","3.guides",[64,66,104,130,152,210],{"title":10,"path":61,"stem":65},"3.guides\u002Findex",{"title":67,"path":68,"stem":69,"children":70},"Day to day","\u002Fguides\u002Fday-to-day","3.guides\u002F1.day-to-day\u002Findex",[71,72,76,80,84,88,92,96,100],{"title":10,"path":68,"stem":69},{"title":73,"path":74,"stem":75},"The setup wizard on first start","\u002Fguides\u002Fday-to-day\u002Ffirst-run","3.guides\u002F1.day-to-day\u002F2.first-run",{"title":77,"path":78,"stem":79},"File a work item","\u002Fguides\u002Fday-to-day\u002Ffile-a-work-item","3.guides\u002F1.day-to-day\u002F3.file-a-work-item",{"title":81,"path":82,"stem":83},"Use Kraft from your agent","\u002Fguides\u002Fday-to-day\u002Fagent-integration","3.guides\u002F1.day-to-day\u002F4.agent-integration",{"title":85,"path":86,"stem":87},"Reviewing a change","\u002Fguides\u002Fday-to-day\u002Freview-a-change","3.guides\u002F1.day-to-day\u002F5.review-a-change",{"title":89,"path":90,"stem":91},"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":93,"path":94,"stem":95},"Kraft for VS Code","\u002Fguides\u002Fday-to-day\u002Fvscode","3.guides\u002F1.day-to-day\u002F7.vscode",{"title":97,"path":98,"stem":99},"Kraft on a phone","\u002Fguides\u002Fday-to-day\u002Fkraft-on-a-phone","3.guides\u002F1.day-to-day\u002F8.kraft-on-a-phone",{"title":101,"path":102,"stem":103},"Get notified when an item needs you","\u002Fguides\u002Fday-to-day\u002Fnotifications","3.guides\u002F1.day-to-day\u002F9.notifications",{"title":105,"path":106,"stem":107,"children":108},"Customize and automate","\u002Fguides\u002Fcustomize","3.guides\u002F2.customize\u002Findex",[109,110,114,118,122,126],{"title":10,"path":106,"stem":107},{"title":111,"path":112,"stem":113},"Write your own chain","\u002Fguides\u002Fcustomize\u002Fwrite-your-own-chain","3.guides\u002F2.customize\u002F1.write-your-own-chain",{"title":115,"path":116,"stem":117},"Add a security review or a gate reviewer","\u002Fguides\u002Fcustomize\u002Fadd-review-agents","3.guides\u002F2.customize\u002F2.add-review-agents",{"title":119,"path":120,"stem":121},"Schedule or webhook work","\u002Fguides\u002Fcustomize\u002Fschedule-and-webhook-work","3.guides\u002F2.customize\u002F3.schedule-and-webhook-work",{"title":123,"path":124,"stem":125},"Share chains with add-ons","\u002Fguides\u002Fcustomize\u002Fshare-chains-with-addons","3.guides\u002F2.customize\u002F4.share-chains-with-addons",{"title":127,"path":128,"stem":129},"Publish an add-on","\u002Fguides\u002Fcustomize\u002Fpublish-an-add-on","3.guides\u002F2.customize\u002F5.publish-an-add-on",{"title":131,"path":132,"stem":133,"children":134},"Agents and harnesses","\u002Fguides\u002Fharnesses","3.guides\u002F3.harnesses\u002Findex",[135,136,140,144,148],{"title":10,"path":132,"stem":133},{"title":137,"path":138,"stem":139},"Switch a task to another harness","\u002Fguides\u002Fharnesses\u002Fswitch-harness","3.guides\u002F3.harnesses\u002F1.switch-harness",{"title":141,"path":142,"stem":143},"Add or override a harness","\u002Fguides\u002Fharnesses\u002Fadding-a-harness","3.guides\u002F3.harnesses\u002F2.adding-a-harness",{"title":145,"path":146,"stem":147},"Build a worker Kit","\u002Fguides\u002Fharnesses\u002Fworker-kit","3.guides\u002F3.harnesses\u002F3.worker-kit",{"title":149,"path":150,"stem":151},"Give a worker its login","\u002Fguides\u002Fharnesses\u002Fgive-a-worker-its-login","3.guides\u002F3.harnesses\u002F4.give-a-worker-its-login",{"title":153,"path":154,"stem":155,"children":156},"Run the server","\u002Fguides\u002Frun","3.guides\u002F4.run\u002Findex",[157,158,162,166,170,174,178,182,186,190,194,198,202,206],{"title":10,"path":154,"stem":155},{"title":159,"path":160,"stem":161},"Remote access","\u002Fguides\u002Frun\u002Fremote-access","3.guides\u002F4.run\u002F01.remote-access",{"title":163,"path":164,"stem":165},"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":167,"path":168,"stem":169},"Restart Kraft without ending running steps","\u002Fguides\u002Frun\u002Frestart-kraft","3.guides\u002F4.run\u002F03.restart-kraft",{"title":171,"path":172,"stem":173},"Back up and restore the database","\u002Fguides\u002Frun\u002Fback-up-and-restore","3.guides\u002F4.run\u002F04.back-up-and-restore",{"title":175,"path":176,"stem":177},"Logs and disk space","\u002Fguides\u002Frun\u002Flogs-and-disk-space","3.guides\u002F4.run\u002F05.logs-and-disk-space",{"title":179,"path":180,"stem":181},"Run Kraft as a service","\u002Fguides\u002Frun\u002Frun-as-a-service","3.guides\u002F4.run\u002F06.run-as-a-service",{"title":183,"path":184,"stem":185},"Upgrade Kraft","\u002Fguides\u002Frun\u002Fupgrade-kraft","3.guides\u002F4.run\u002F07.upgrade-kraft",{"title":187,"path":188,"stem":189},"Upgrade your configuration","\u002Fguides\u002Frun\u002Fupgrade-your-configuration","3.guides\u002F4.run\u002F08.upgrade-your-configuration",{"title":191,"path":192,"stem":193},"Upgrade from 1.4","\u002Fguides\u002Frun\u002Fupgrade-from-1-4","3.guides\u002F4.run\u002F09.upgrade-from-1-4",{"title":195,"path":196,"stem":197},"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":199,"path":200,"stem":201},"Roll back to 1.4","\u002Fguides\u002Frun\u002Froll-back","3.guides\u002F4.run\u002F11.roll-back",{"title":203,"path":204,"stem":205},"Run items in your own checkout","\u002Fguides\u002Frun\u002Frun-items-in-place","3.guides\u002F4.run\u002F12.run-items-in-place",{"title":207,"path":208,"stem":209},"Run a step on another machine","\u002Fguides\u002Frun\u002Frun-a-step-on-another-machine","3.guides\u002F4.run\u002F13.run-a-step-on-another-machine",{"title":211,"path":212,"stem":213},"Kraft Lite","\u002Fguides\u002Fkraft-lite","3.guides\u002F5.kraft-lite",{"title":215,"path":216,"stem":217,"children":218},"Troubleshooting","\u002Ftroubleshooting","4.troubleshooting",[219,221,225,229,233,237,241],{"title":10,"path":216,"stem":220},"4.troubleshooting\u002Findex",{"title":222,"path":223,"stem":224},"Why did my item stop?","\u002Ftroubleshooting\u002Fwhy-did-my-item-stop","4.troubleshooting\u002F1.why-did-my-item-stop",{"title":226,"path":227,"stem":228},"Stop reasons in detail","\u002Ftroubleshooting\u002Fstop-reasons-in-detail","4.troubleshooting\u002F2.stop-reasons-in-detail",{"title":230,"path":231,"stem":232},"Starting and reaching Kraft","\u002Ftroubleshooting\u002Fstarting-and-reaching-kraft","4.troubleshooting\u002F3.starting-and-reaching-kraft",{"title":234,"path":235,"stem":236},"Doctor failures","\u002Ftroubleshooting\u002Fdoctor-failures","4.troubleshooting\u002F4.doctor-failures",{"title":238,"path":239,"stem":240},"Sandbox and Kit stops","\u002Ftroubleshooting\u002Fsandbox-and-kit-stops","4.troubleshooting\u002F5.sandbox-and-kit-stops",{"title":242,"path":243,"stem":244},"Add-on problems","\u002Ftroubleshooting\u002Faddon-problems","4.troubleshooting\u002F6.addon-problems",{"title":246,"path":247,"stem":248,"children":249},"Reference","\u002Freference","5.reference",[250,252,294,316,320,324,434,452,478,482,486,520,524,528,532],{"title":10,"path":247,"stem":251},"5.reference\u002Findex",{"title":253,"path":254,"stem":255,"children":256},"Web UI","\u002Freference\u002Fweb-ui","5.reference\u002F00.web-ui\u002Findex",[257,258,262,266,270,274,278,282,286,290],{"title":10,"path":254,"stem":255},{"title":259,"path":260,"stem":261},"Sidebar, search, and keyboard","\u002Freference\u002Fweb-ui\u002Fsidebar-search-and-keyboard","5.reference\u002F00.web-ui\u002F0.sidebar-search-and-keyboard",{"title":263,"path":264,"stem":265},"The board","\u002Freference\u002Fweb-ui\u002Fboard","5.reference\u002F00.web-ui\u002F1.board",{"title":267,"path":268,"stem":269},"An item's page","\u002Freference\u002Fweb-ui\u002Fitem-page","5.reference\u002F00.web-ui\u002F2.item-page",{"title":271,"path":272,"stem":273},"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":275,"path":276,"stem":277},"Config before an item starts","\u002Freference\u002Fweb-ui\u002Fconfig-before-start","5.reference\u002F00.web-ui\u002F4.config-before-start",{"title":279,"path":280,"stem":281},"The review page","\u002Freference\u002Fweb-ui\u002Freview-page","5.reference\u002F00.web-ui\u002F5.review-page",{"title":283,"path":284,"stem":285},"Templates and Settings","\u002Freference\u002Fweb-ui\u002Ftemplates-and-settings","5.reference\u002F00.web-ui\u002F6.templates-and-settings",{"title":287,"path":288,"stem":289},"Analytics","\u002Freference\u002Fweb-ui\u002Fanalytics","5.reference\u002F00.web-ui\u002F7.analytics",{"title":291,"path":292,"stem":293},"Cap stops and raises","\u002Freference\u002Fweb-ui\u002Fcap-stops-and-raises","5.reference\u002F00.web-ui\u002F8.cap-stops-and-raises",{"title":295,"path":296,"stem":297,"children":298},"CLI","\u002Freference\u002Fcli","5.reference\u002F01.cli\u002Findex",[299,300,304,308,312],{"title":10,"path":296,"stem":297},{"title":301,"path":302,"stem":303},"Item verbs","\u002Freference\u002Fcli\u002Fitem","5.reference\u002F01.cli\u002F2.item",{"title":305,"path":306,"stem":307},"View verbs","\u002Freference\u002Fcli\u002Fview","5.reference\u002F01.cli\u002F3.view",{"title":309,"path":310,"stem":311},"Repo verbs","\u002Freference\u002Fcli\u002Frepo","5.reference\u002F01.cli\u002F4.repo",{"title":313,"path":314,"stem":315},"Admin verbs","\u002Freference\u002Fcli\u002Fadmin","5.reference\u002F01.cli\u002F5.admin",{"title":317,"path":318,"stem":319},"Console","\u002Freference\u002Fconsole","5.reference\u002F01.console",{"title":321,"path":322,"stem":323},"Work item statuses","\u002Freference\u002Fstatuses","5.reference\u002F02.statuses",{"title":325,"path":326,"stem":327,"children":328},"Configuration","\u002Freference\u002Fconfiguration","5.reference\u002F03.configuration\u002Findex",[329,330,348,352,356,360,364,368,372,376,414,418,422,426,430],{"title":10,"path":326,"stem":327},{"title":331,"path":332,"stem":333,"children":334},"repos.yaml","\u002Freference\u002Fconfiguration\u002Frepos","5.reference\u002F03.configuration\u002F02.repos\u002Findex",[335,336,340,344],{"title":10,"path":332,"stem":333},{"title":337,"path":338,"stem":339},"How connect proposes commands","\u002Freference\u002Fconfiguration\u002Frepos\u002Fconnect-proposals","5.reference\u002F03.configuration\u002F02.repos\u002F1.connect-proposals",{"title":341,"path":342,"stem":343},"detectors.yaml","\u002Freference\u002Fconfiguration\u002Frepos\u002Fdetectors","5.reference\u002F03.configuration\u002F02.repos\u002F2.detectors",{"title":345,"path":346,"stem":347},"Workspaces","\u002Freference\u002Fconfiguration\u002Frepos\u002Fworkspaces","5.reference\u002F03.configuration\u002F02.repos\u002F3.workspaces",{"title":349,"path":350,"stem":351},"policy.yaml","\u002Freference\u002Fconfiguration\u002Fpolicy","5.reference\u002F03.configuration\u002F03.policy",{"title":353,"path":354,"stem":355},"Library and chains","\u002Freference\u002Fconfiguration\u002Flibrary-and-chains","5.reference\u002F03.configuration\u002F04.library-and-chains",{"title":357,"path":358,"stem":359},"harnesses.yaml","\u002Freference\u002Fconfiguration\u002Fharnesses-file","5.reference\u002F03.configuration\u002F05.harnesses-file",{"title":361,"path":362,"stem":363},"access.yaml","\u002Freference\u002Fconfiguration\u002Faccess","5.reference\u002F03.configuration\u002F06.access",{"title":365,"path":366,"stem":367},"intake.yaml","\u002Freference\u002Fconfiguration\u002Fintake","5.reference\u002F03.configuration\u002F07.intake",{"title":369,"path":370,"stem":371},"notify.yaml","\u002Freference\u002Fconfiguration\u002Fnotify","5.reference\u002F03.configuration\u002F08.notify",{"title":373,"path":374,"stem":375},"theme.yaml","\u002Freference\u002Fconfiguration\u002Ftheme","5.reference\u002F03.configuration\u002F09.theme",{"title":377,"path":378,"stem":379,"children":380},"Sandboxed workers","\u002Freference\u002Fconfiguration\u002Fsandbox","5.reference\u002F03.configuration\u002F10.sandbox\u002Findex",[381,382,386,390,394,398,402,406,410],{"title":10,"path":378,"stem":379},{"title":383,"path":384,"stem":385},"Resource limits","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fresource-limits","5.reference\u002F03.configuration\u002F10.sandbox\u002F1.resource-limits",{"title":387,"path":388,"stem":389},"Callbacks from a sandbox","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fcallbacks","5.reference\u002F03.configuration\u002F10.sandbox\u002F2.callbacks",{"title":391,"path":392,"stem":393},"Network policy","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fnetwork-policy","5.reference\u002F03.configuration\u002F10.sandbox\u002F3.network-policy",{"title":395,"path":396,"stem":397},"Credentials","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fcredentials","5.reference\u002F03.configuration\u002F10.sandbox\u002F4.credentials",{"title":399,"path":400,"stem":401},"Kits","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fkits","5.reference\u002F03.configuration\u002F10.sandbox\u002F5.kits",{"title":403,"path":404,"stem":405},"sandbox.yaml","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fsandbox-yaml","5.reference\u002F03.configuration\u002F10.sandbox\u002F6.sandbox-yaml",{"title":407,"path":408,"stem":409},"Git in a sandbox","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fgit-in-a-sandbox","5.reference\u002F03.configuration\u002F10.sandbox\u002F7.git-in-a-sandbox",{"title":411,"path":412,"stem":413},"The OS sandbox","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fos-sandbox","5.reference\u002F03.configuration\u002F10.sandbox\u002F8.os-sandbox",{"title":415,"path":416,"stem":417},"Environment variables","\u002Freference\u002Fconfiguration\u002Fenvironment-variables","5.reference\u002F03.configuration\u002F11.environment-variables",{"title":419,"path":420,"stem":421},"Add-ons and collections","\u002Freference\u002Fconfiguration\u002Faddons","5.reference\u002F03.configuration\u002F12.addons",{"title":423,"path":424,"stem":425},"Repo libraries","\u002Freference\u002Fconfiguration\u002Frepo-libraries","5.reference\u002F03.configuration\u002F13.repo-libraries",{"title":427,"path":428,"stem":429},"update.yaml","\u002Freference\u002Fconfiguration\u002Fupdate","5.reference\u002F03.configuration\u002F14.update",{"title":431,"path":432,"stem":433},"workers.yaml","\u002Freference\u002Fconfiguration\u002Fworkers","5.reference\u002F03.configuration\u002F15.workers",{"title":435,"path":436,"stem":437,"children":438},"Chain file keys","\u002Freference\u002Fchain-nodes","5.reference\u002F04.chain-nodes\u002Findex",[439,440,444,448],{"title":10,"path":436,"stem":437},{"title":441,"path":442,"stem":443},"Subprocess tasks","\u002Freference\u002Fchain-nodes\u002Fsubprocess-tasks","5.reference\u002F04.chain-nodes\u002F2.subprocess-tasks",{"title":445,"path":446,"stem":447},"Fix loop and judge","\u002Freference\u002Fchain-nodes\u002Ffix-loop","5.reference\u002F04.chain-nodes\u002F3.fix-loop",{"title":449,"path":450,"stem":451},"Result file","\u002Freference\u002Fchain-nodes\u002Fresult-file","5.reference\u002F04.chain-nodes\u002F4.result-file",{"title":453,"path":454,"stem":455,"children":456},"Agent harnesses","\u002Freference\u002Fharnesses","5.reference\u002F05.harnesses\u002Findex",[457,458,462,466,470,474],{"title":10,"path":454,"stem":455},{"title":459,"path":460,"stem":461},"Unattended runs","\u002Freference\u002Fharnesses\u002Funattended-runs","5.reference\u002F05.harnesses\u002F2.unattended-runs",{"title":463,"path":464,"stem":465},"Agent profiles","\u002Freference\u002Fharnesses\u002Fagent-profiles","5.reference\u002F05.harnesses\u002F3.agent-profiles",{"title":467,"path":468,"stem":469},"Harness definition files","\u002Freference\u002Fharnesses\u002Fharness-files","5.reference\u002F05.harnesses\u002F4.harness-files",{"title":471,"path":472,"stem":473},"Fallback and escalation","\u002Freference\u002Fharnesses\u002Ffallback-and-escalation","5.reference\u002F05.harnesses\u002F5.fallback-and-escalation",{"title":475,"path":476,"stem":477},"Cost reporting","\u002Freference\u002Fharnesses\u002Fcost-reporting","5.reference\u002F05.harnesses\u002F6.cost-reporting",{"title":479,"path":480,"stem":481},"Permission gate","\u002Freference\u002Fpermissions","5.reference\u002F06.permissions",{"title":483,"path":484,"stem":485},"Inbound triggers","\u002Freference\u002Ftriggers","5.reference\u002F07.triggers",{"title":487,"path":488,"stem":489,"children":490},"HTTP API","\u002Freference\u002Fhttp-api","5.reference\u002F08.http-api\u002Findex",[491,492,496,500,504,508,512,516],{"title":10,"path":488,"stem":489},{"title":493,"path":494,"stem":495},"Filing, reading and changing work items","\u002Freference\u002Fhttp-api\u002Fwork-items","5.reference\u002F08.http-api\u002F2.work-items",{"title":497,"path":498,"stem":499},"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":501,"path":502,"stem":503},"The work item object","\u002Freference\u002Fhttp-api\u002Fwork-item-object","5.reference\u002F08.http-api\u002F4.work-item-object",{"title":505,"path":506,"stem":507},"Budget, events, diff and documents","\u002Freference\u002Fhttp-api\u002Fbudget-and-events","5.reference\u002F08.http-api\u002F5.budget-and-events",{"title":509,"path":510,"stem":511},"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":513,"path":514,"stem":515},"Drafts","\u002Freference\u002Fhttp-api\u002Fdrafts","5.reference\u002F08.http-api\u002F7.drafts",{"title":517,"path":518,"stem":519},"Ops for each draft area","\u002Freference\u002Fhttp-api\u002Fdraft-ops","5.reference\u002F08.http-api\u002F8.draft-ops",{"title":521,"path":522,"stem":523},"MCP tools","\u002Freference\u002Fmcp-tools","5.reference\u002F09.mcp-tools",{"title":525,"path":526,"stem":527},"Events","\u002Freference\u002Fevents","5.reference\u002F10.events",{"title":529,"path":530,"stem":531},"VS Code extension","\u002Freference\u002Fvscode-extension","5.reference\u002F11.vscode-extension",{"title":533,"path":534,"stem":535},"Changes from 1.4 to 2.0","\u002Freference\u002Fchanges-from-1-4","5.reference\u002F12.changes-from-1-4",{"title":537,"path":538,"stem":539,"children":540},"Project","\u002Fproject","6.project",[541,543,547,551,555,559,563,567],{"title":10,"path":538,"stem":542},"6.project\u002Findex",{"title":544,"path":545,"stem":546},"Security","\u002Fproject\u002Fsecurity","6.project\u002F1.security",{"title":548,"path":549,"stem":550},"Data and privacy","\u002Fproject\u002Fdata-and-privacy","6.project\u002F2.data-and-privacy",{"title":552,"path":553,"stem":554},"What's new in 2.0","\u002Fproject\u002Fwhats-new","6.project\u002F3.whats-new",{"title":556,"path":557,"stem":558},"Status and support","\u002Fproject\u002Fstatus-and-support","6.project\u002F4.status-and-support",{"title":560,"path":561,"stem":562},"Architecture","\u002Fproject\u002Farchitecture","6.project\u002F5.architecture",{"title":564,"path":565,"stem":566},"Source map","\u002Fproject\u002Fsource-map","6.project\u002F6.source-map",{"title":568,"path":569,"stem":570},"Contributing","\u002Fproject\u002Fcontributing","6.project\u002F7.contributing",{"id":572,"title":207,"body":573,"description":1212,"extension":1213,"links":1214,"meta":1215,"navigation":1216,"path":208,"seo":1217,"stem":209,"__hash__":1218},"docs\u002F3.guides\u002F4.run\u002F13.run-a-step-on-another-machine.md",{"type":574,"value":575,"toc":1200},"minimark",[576,583,592,609,614,622,665,676,694,709,729,733,736,764,775,782,786,796,810,817,821,828,872,890,894,901,956,981,985,1042,1049,1063,1067,1081,1085,1092,1114,1118,1121,1131,1142,1154,1158,1196],[577,578,579],"p",{},[580,581,582],"em",{},"Added in 2.4",[577,584,585,586,591],{},"A ",[587,588,590],"a",{"href":589},"\u002Fconcepts\u002Fvocabulary#work-item","work item","'s steps run on the machine the Kraft server runs on. This guide moves one of them to another computer you already have: a build box, a GPU machine, a Linux host. The board, gates, repos and the item's branch stay where they are.",[577,593,594,595,599,600,603,604,608],{},"You need ",[596,597,598],"code",{},"kraft"," on the other machine, the agent CLIs it should run installed and logged in there, and ",[596,601,602],{},"git",". Kraft installs nothing and sends no credential. For a ",[587,605,607],{"href":606},"\u002Freference\u002Fconfiguration\u002Fsandbox#on-a-remote-machine","sandboxed"," item the machine also needs the sandbox runtime and the item's image.",[610,611,613],"h2",{"id":612},"register-the-machine","Register the machine",[577,615,616,617,621],{},"In Settings › Workers, press ",[618,619,620],"strong",{},"Add machine","; the dialog asks for the same things as the commands below, and shows a dial-in machine's token once. Or, on the server's machine, add it in a terminal. For one the server can reach over ssh:",[623,624,630],"pre",{"className":625,"code":626,"language":627,"meta":628,"style":629},"language-bash shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","kraft admin worker add gpu-box --ssh gpu-box --capacity 2\n","bash","each","",[596,631,632],{"__ignoreMap":629},[633,634,637,640,644,647,650,653,657,659,662],"span",{"class":635,"line":636},"line",1,[633,638,598],{"class":639},"szw1H",[633,641,643],{"class":642},"semJd"," admin",[633,645,646],{"class":642}," worker",[633,648,649],{"class":642}," add",[633,651,652],{"class":642}," gpu-box",[633,654,656],{"class":655},"ssYy9"," --ssh",[633,658,652],{"class":642},[633,660,661],{"class":655}," --capacity",[633,663,664],{"class":655}," 2\n",[577,666,667,668,671,672,675],{},"It saves the machine, connects once and prints ",[596,669,670],{},"connected",", or why not. For a machine that can reach the server but not the other way round, leave out ",[596,673,674],{},"--ssh",". The command prints a token once and the command to run on the machine:",[623,677,679],{"className":625,"code":678,"language":627,"meta":628,"style":629},"kraft admin worker add home-server\n",[596,680,681],{"__ignoreMap":629},[633,682,683,685,687,689,691],{"class":635,"line":636},[633,684,598],{"class":639},[633,686,643],{"class":642},[633,688,646],{"class":642},[633,690,649],{"class":642},[633,692,693],{"class":642}," home-server\n",[577,695,696,697,700,701,705,706,708],{},"Then run the printed ",[596,698,699],{},"kraft admin worker serve --server URL --token TOKEN"," on the machine. The machine must be able to reach the server, which means binding the server beyond loopback with a password; see ",[587,702,704],{"href":703},"\u002Fguides\u002Frun\u002Fremote-access#let-another-machine-connect","Let another machine connect",". See ",[587,707,431],{"href":432}," for the two ways to connect.",[577,710,711,712,715,716,719,720,723,724,728],{},"The machine can also limit itself. Put ",[596,713,714],{},"capacity: 2"," in ",[596,717,718],{},"machine.yaml"," in its Kraft config directory, and it never runs more than two steps at once, whatever ",[596,721,722],{},"--capacity"," says on the server: the lower of the two is used. A step it turns away goes to another machine, or waits. See ",[587,725,727],{"href":726},"\u002Freference\u002Fconfiguration\u002Fworkers#the-machines-own-limit","The machine's own limit",".",[610,730,732],{"id":731},"check-the-machine","Check the machine",[577,734,735],{},"On the machine itself, for a dial-in machine with the server's address and its token:",[623,737,739],{"className":625,"code":738,"language":627,"meta":628,"style":629},"kraft admin worker check --server URL --token TOKEN\n",[596,740,741],{"__ignoreMap":629},[633,742,743,745,747,749,752,755,758,761],{"class":635,"line":636},[633,744,598],{"class":639},[633,746,643],{"class":642},[633,748,646],{"class":642},[633,750,751],{"class":642}," check",[633,753,754],{"class":655}," --server",[633,756,757],{"class":642}," URL",[633,759,760],{"class":655}," --token",[633,762,763],{"class":642}," TOKEN\n",[577,765,766,767,770,771,774],{},"It lists git, each agent CLI with its login, one row per sandbox backend that works there and whether the server answers with a valid token. Without ",[596,768,769],{},"--server"," and ",[596,772,773],{},"--token"," it leaves out the server row, which is how to check an ssh machine.",[577,776,777,778,781],{},"It exits 1 on any failure; a machine with no usable sandbox backend only warns, because it can still run items that are not sandboxed. ",[596,779,780],{},"kraft admin worker list"," on the server shows whether the machine is online and why not.",[610,783,785],{"id":784},"keep-the-machines-kraft-current","Keep the machine's Kraft current",[577,787,788,789,792,793,795],{},"The machine and the server must run the same major version of Kraft. A machine on another major is turned away when it connects, with ",[596,790,791],{},"update kraft on this machine to X.y: it runs A.b, another major version",", and ",[596,794,780],{}," shows that as why it is offline. A machine on an older release of the same major keeps getting steps.",[577,797,798,799,802,803,805,806,728],{},"The one exception is a ",[596,800,801],{},"codex"," step that needs Kraft's permission hook. A machine whose Kraft is too old to have its own ",[596,804,801],{}," trust the hook is refused that step; see ",[587,807,809],{"href":808},"\u002Freference\u002Fconfiguration\u002Fworkers#codex-steps-on-a-machine","Codex steps on a machine",[577,811,812,813,816],{},"When you update the server to a new major version, update the machines too: ",[596,814,815],{},"kraft admin update"," on each.",[610,818,820],{"id":819},"put-a-node-on-it","Put a node on it",[577,822,823,824,827],{},"In a chain file, add ",[596,825,826],{},"runner:"," to a node:",[623,829,834],{"className":830,"code":831,"filename":832,"language":833,"meta":629,"style":629},"language-yaml shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","nodes:\n  - id: implementation\n    runner: gpu-box\n","config\u002Fchains\u002Fdefault.yaml","yaml",[596,835,836,846,861],{"__ignoreMap":629},[633,837,838,842],{"class":635,"line":636},[633,839,841],{"class":840},"sb7M8","nodes",[633,843,845],{"class":844},"s7iLA",":\n",[633,847,849,852,855,858],{"class":635,"line":848},2,[633,850,851],{"class":844},"  - ",[633,853,854],{"class":840},"id",[633,856,857],{"class":844},": ",[633,859,860],{"class":642},"implementation\n",[633,862,864,867,869],{"class":635,"line":863},3,[633,865,866],{"class":840},"    runner",[633,868,857],{"class":844},[633,870,871],{"class":642},"gpu-box\n",[577,873,874,875,878,879,882,883,885,886,728],{},"The value is a machine's name, a group's name, ",[596,876,877],{},"any"," (the first connected machine that may work on every repo of the item and has a free slot, never the server) or ",[596,880,881],{},"local",". A step's own ",[596,884,826],{}," beats its node's, and a node's beats its chain's. See ",[587,887,889],{"href":888},"\u002Freference\u002Fconfiguration\u002Flibrary-and-chains#placing-a-step-on-a-machine","Placing a step on a machine",[610,891,893],{"id":892},"put-a-step-on-a-group-of-machines","Put a step on a group of machines",[577,895,896,897,900],{},"A group is a name you give several machines, so a step can ask for \"a GPU machine\" without picking one. Put machines in groups when you add them, ",[596,898,899],{},"--group"," as often as you like:",[623,902,904],{"className":625,"code":903,"language":627,"meta":628,"style":629},"kraft admin worker add gpu-1 --ssh gpu-1 --group gpu\nkraft admin worker add gpu-2 --ssh gpu-2 --group gpu --group linux\n",[596,905,906,929],{"__ignoreMap":629},[633,907,908,910,912,914,916,919,921,923,926],{"class":635,"line":636},[633,909,598],{"class":639},[633,911,643],{"class":642},[633,913,646],{"class":642},[633,915,649],{"class":642},[633,917,918],{"class":642}," gpu-1",[633,920,656],{"class":655},[633,922,918],{"class":642},[633,924,925],{"class":655}," --group",[633,927,928],{"class":642}," gpu\n",[633,930,931,933,935,937,939,942,944,946,948,951,953],{"class":635,"line":848},[633,932,598],{"class":639},[633,934,643],{"class":642},[633,936,646],{"class":642},[633,938,649],{"class":642},[633,940,941],{"class":642}," gpu-2",[633,943,656],{"class":655},[633,945,941],{"class":642},[633,947,925],{"class":655},[633,949,950],{"class":642}," gpu",[633,952,925],{"class":655},[633,954,955],{"class":642}," linux\n",[577,957,958,959,961,962,965,966,969,970,972,973,976,977,728],{},"Then name the group as the ",[596,960,826],{},", in a chain or with ",[596,963,964],{},"--runner gpu",". The step goes to the first of the group's machines that is online, may work on the repo and has a free slot, and waits as ",[596,967,968],{},"waiting for a machine in gpu"," when none has. To let the local worker take steps too, join it in ",[596,971,431],{}," with ",[596,974,975],{},"local: groups: [gpu]",". It is tried after the others. Group and machine names share one namespace. See ",[587,978,980],{"href":979},"\u002Freference\u002Fconfiguration\u002Fworkers#groups","Groups",[610,982,984],{"id":983},"place-one-item-without-editing-a-chain","Place one item without editing a chain",[623,986,988],{"className":625,"code":987,"language":627,"meta":628,"style":629},"kraft item create \"tidy the parser\" --runner gpu-box\nkraft item set-overrides --runner gpu-box\nkraft item set-node-override --node verify --runner local\n",[596,989,990,1009,1022],{"__ignoreMap":629},[633,991,992,994,997,1000,1003,1006],{"class":635,"line":636},[633,993,598],{"class":639},[633,995,996],{"class":642}," item",[633,998,999],{"class":642}," create",[633,1001,1002],{"class":642}," \"tidy the parser\"",[633,1004,1005],{"class":655}," --runner",[633,1007,1008],{"class":642}," gpu-box\n",[633,1010,1011,1013,1015,1018,1020],{"class":635,"line":848},[633,1012,598],{"class":639},[633,1014,996],{"class":642},[633,1016,1017],{"class":642}," set-overrides",[633,1019,1005],{"class":655},[633,1021,1008],{"class":642},[633,1023,1024,1026,1028,1031,1034,1037,1039],{"class":635,"line":863},[633,1025,598],{"class":639},[633,1027,996],{"class":642},[633,1029,1030],{"class":642}," set-node-override",[633,1032,1033],{"class":655}," --node",[633,1035,1036],{"class":642}," verify",[633,1038,1005],{"class":655},[633,1040,1041],{"class":642}," local\n",[577,1043,1044,1045,1048],{},"The first files an item whose steps all run on ",[596,1046,1047],{},"gpu-box",". The second changes it for the whole item. The third overrides one node and wins over both. A change takes effect at the next step launch, even on a node that has started.",[577,1050,1051,1052,1054,1055,1058,1059,728],{},"Kraft refuses, with a 422, a machine or group that is not in ",[596,1053,431],{},", a machine not allowed for the repo, and an item that is in place or has workspace members. A group takes such an item only when the local worker is one of its members. A repo that uses Git LFS runs on a machine that has ",[596,1056,1057],{},"git-lfs","; see ",[587,1060,1062],{"href":1061},"\u002Freference\u002Fconfiguration\u002Fworkers#git-lfs-repos-on-a-machine","Git LFS repos on a machine",[610,1064,1066],{"id":1065},"read-a-waiting-item","Read a waiting item",[577,1068,1069,1070,1073,1074,1076,1077,728],{},"An item whose machine is offline or full shows ",[596,1071,1072],{},"waiting for gpu-box (full)",", or ",[596,1075,968],{}," for a group. It holds no slot on the server and its time cap does not run. It starts when the machine is back or a slot frees. Kraft never runs the step on the server instead. See ",[587,1078,1080],{"href":1079},"\u002Ftroubleshooting\u002Fwhy-did-my-item-stop#waiting-for-a-machine","Waiting for a machine",[610,1082,1084],{"id":1083},"what-comes-back","What comes back",[577,1086,1087,1088,1091],{},"The log streams to the server as the step writes it, so ",[596,1089,1090],{},"kraft view logs -f"," works as for a local step, and pause and cancel reach the machine.",[577,1093,1094,1095,1098,1099,1102,1103,1106,1107,705,1110,728],{},"After the step, its new commits, ",[596,1096,1097],{},"result.json",", ",[596,1100,1101],{},"summary.md"," and changed documents are taken in before the server looks at the step. The next step, or a gate, sees them wherever it runs. If the branch moved meanwhile, the commits are kept at ",[596,1104,1105],{},"refs\u002Fkraft\u002Funsynced\u002F..."," and the item records ",[596,1108,1109],{},"sandbox_branch_not_synced",[587,1111,1113],{"href":1112},"\u002Freference\u002Fconfiguration\u002Fworkers#if-something-goes-wrong","If something goes wrong",[610,1115,1117],{"id":1116},"when-your-laptop-sleeps","When your laptop sleeps",[577,1119,1120],{},"When the laptop the Kraft server runs on sleeps, the step keeps running on the machine. When the laptop wakes, the connection comes back by itself: the server redials an ssh machine, and a dial-in machine redials the server. The log carries on where it stopped, and a step that finished meanwhile hands in its commits and documents.",[577,1122,1123,1124,1127,1128,728],{},"Two things end a step early. Each machine has a ",[596,1125,1126],{},"give_up_after",", 2 hours unless you set it. A machine that has had no connection for that long stops its step. The server, once that much of its own awake time has passed, marks the session ",[596,1129,1130],{},"unknown",[577,1132,1133,1134,1137,1138,1141],{},"Only time the laptop was awake counts on the server's side, so a night's sleep does not use it up. Set ",[596,1135,1136],{},"--give-up-after never"," on ",[596,1139,1140],{},"worker add"," for a machine whose steps should wait however long it takes. The task pane then shows the step as unreachable since the time it dropped.",[577,1143,1144,1145,1148,1149,1153],{},"A step's time cap and idle-output limit are also checked on the machine, so a capped step stops on time with the lid closed and shows ",[596,1146,1147],{},"time_cap_reached"," when the laptop wakes. See ",[587,1150,1152],{"href":1151},"\u002Freference\u002Fconfiguration\u002Fworkers#when-the-server-is-gone","When the server is gone"," for each rule, and Settings › Workers for whether each machine is reachable now.",[610,1155,1157],{"id":1156},"related","Related",[1159,1160,1161,1167,1172,1180],"ul",{},[1162,1163,1164,1166],"li",{},[587,1165,56],{"href":57},": why a step runs through a worker, what travels to a machine, and what the server checks.",[1162,1168,1169,1171],{},[587,1170,431],{"href":432},": every field and connection mode.",[1162,1173,1174,857,1177,728],{},[587,1175,313],{"href":1176},"\u002Freference\u002Fcli\u002Fadmin#machines",[596,1178,1179],{},"kraft admin worker",[1162,1181,1182,857,1184,1137,1187,1098,1190,770,1193,728],{},[587,1183,301],{"href":302},[596,1185,1186],{},"--runner",[596,1188,1189],{},"create",[596,1191,1192],{},"set-overrides",[596,1194,1195],{},"set-node-override",[1197,1198,1199],"style",{},"html pre.shiki code .szw1H, html code.shiki .szw1H{--shiki-light:#702C00;--shiki-default:#702C00;--shiki-dark:#FFB757}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 .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 .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}",{"title":629,"searchDepth":848,"depth":848,"links":1201},[1202,1203,1204,1205,1206,1207,1208,1209,1210,1211],{"id":612,"depth":848,"text":613},{"id":731,"depth":848,"text":732},{"id":784,"depth":848,"text":785},{"id":819,"depth":848,"text":820},{"id":892,"depth":848,"text":893},{"id":983,"depth":848,"text":984},{"id":1065,"depth":848,"text":1066},{"id":1083,"depth":848,"text":1084},{"id":1116,"depth":848,"text":1117},{"id":1156,"depth":848,"text":1157},"Register a machine, put a node of a chain on it, override the placement for one item, read what a waiting item means, and see what comes back after a step.","md",null,{},true,{"title":207,"description":1212},"p8DhQA9gdtqHFahzGaYQE8QGyiausR0Y_hFSoSf1s8I",[1220,1222],{"title":203,"path":204,"stem":205,"description":1221,"children":-1},"Let a repo's work items run in the folder you connected, instead of in a git worktree each, and get one going again when Kraft stops it to keep your edits safe.",{"title":211,"path":212,"stem":213,"description":1223,"children":-1},"The Kraft Lite plugin, which runs a chain inside one agent session with no service, and its slash commands.",1793024383355]