[{"data":1,"prerenderedAt":1039},["ShallowReactive",2],{"navigation_docs":3,"-guides-harnesses-give-a-worker-its-login":520,"-guides-harnesses-give-a-worker-its-login-surround":1034},[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":135,"body":522,"description":1027,"extension":1028,"links":1029,"meta":1030,"navigation":1031,"path":136,"seo":1032,"stem":137,"__hash__":1033},"docs\u002F3.guides\u002F3.harnesses\u002F4.give-a-worker-its-login.md",{"type":523,"value":524,"toc":1020},"minimark",[525,535,548,553,571,575,581,874,878,888,919,972,976,995,999,1016],[526,527,528,529,534],"p",{},"A ",[530,531,533],"a",{"href":532},"\u002Fconcepts\u002Fvocabulary#worker","worker"," runs headless, with nobody to answer a login prompt. Give the agent CLI a worker runs on a login or key it can use without one, and end with a check that the worker reaches it.",[526,536,537,538,540,541,544,545,547],{},"Which agent CLI runs a work item's tasks is a choice made per task in your templates: every shipped task runs on Claude Code, and ",[530,539,123],{"href":124}," moves tasks to another. Kraft calls that CLI a ",[530,542,543],{"href":411},"harness",". Registering Kraft with the agent you type into, so you can drive Kraft from it, is a different job: see ",[530,546,72],{"href":73},".",[549,550,552],"h2",{"id":551},"before-you-start","Before you start",[554,555,556,565,568],"ul",{},[557,558,559,560,564],"li",{},"The harness's CLI is installed and on the ",[561,562,563],"code",{},"PATH"," of the shell that starts Kraft.",[557,566,567],{},"You know which harness the tasks run on. Every shipped task runs on Claude Code.",[557,569,570],{},"If your harness needs an API key, a way to put a variable in the Kraft server's environment (the shell that starts it, or the service's own settings) and to restart the server.",[549,572,574],{"id":573},"_1-find-what-your-harness-needs","1. Find what your harness needs",[526,576,577,578,580],{},"Pick your harness. Only Claude Code needs Kraft registered with it, and its tab says how. The other six need no registration: for each, ",[530,579,416],{"href":417}," says how Kraft enforces a task's tool rules, or refuses the task when the CLI cannot.",[582,583,585,644,680,716,748,782,848],"tabs",{"sync":584},"agent",[586,587,589],"tabs-item",{"label":588},"Claude Code",[554,590,591,614,635],{},[557,592,593,597,598,601,602,605,606,609,610,547],{},[594,595,596],"strong",{},"Registration."," Required. An unsandboxed Claude worker asks Kraft's\npermission gate through the ",[561,599,600],{},"kraft"," MCP server, and Kraft refuses to launch\none when nothing registers it. The plugin, ",[561,603,604],{},"kraft admin init",", or a committed\n",[561,607,608],{},".mcp.json"," each count: see\n",[530,611,613],{"href":612},"\u002Fguides\u002Fday-to-day\u002Fagent-integration#register-kraft-with-your-agent","Register Kraft with your agent",[557,615,616,619,620,623,624,627,628,631,632,547],{},[594,617,618],{},"Login."," Your normal ",[561,621,622],{},"claude"," login works. ",[561,625,626],{},"ANTHROPIC_API_KEY"," and\n",[561,629,630],{},"CLAUDE_CODE_OAUTH_TOKEN"," reach the worker without ",[561,633,634],{},"env_passthrough",[557,636,637,640,641,547],{},[594,638,639],{},"Check."," ",[561,642,643],{},"claude -p \"say hi\"",[586,645,647],{"label":646},"Codex",[554,648,649,673],{},[557,650,651,653,654,657,658,661,662,664,665,668,669,672],{},[594,652,618],{}," Sign in with ",[561,655,656],{},"codex login","; the login under your home directory\nreaches the worker. With an API key, name ",[561,659,660],{},"CODEX_API_KEY"," in\n",[561,663,634],{},", not ",[561,666,667],{},"OPENAI_API_KEY",", which ",[561,670,671],{},"codex exec"," does not send.",[557,674,675,640,677,547],{},[594,676,639],{},[561,678,679],{},"codex exec \"say hi\"",[586,681,683],{"label":682},"Cursor",[554,684,685,704],{},[557,686,687,640,689,692,693,696,697,700,701,703],{},[594,688,618],{},[561,690,691],{},"agent login"," keeps the login in the OS keychain, which a worker\nreaches unless it is ",[530,694,695],{"href":347},"sandboxed",". With an\nAPI key instead, name ",[561,698,699],{},"CURSOR_API_KEY"," in ",[561,702,634],{},". A sandboxed\nworker can only use the key.",[557,705,706,640,708,711,712,715],{},[594,707,639],{},[561,709,710],{},"agent -p --trust -- \"say hi\"",". Run it in a scratch directory:\n",[561,713,714],{},"--trust"," skips Cursor's workspace-trust prompt for the directory you are in.",[586,717,719],{"label":718},"OpenCode",[554,720,721,730,741],{},[557,722,723,726,727,547],{},[594,724,725],{},"Version."," OpenCode 2.0.0 or newer. Kraft refuses to launch an older one,\nincluding npm's 1.x ",[561,728,729],{},"opencode-ai",[557,731,732,734,735,738,739,547],{},[594,733,618],{}," Log in to your provider with ",[561,736,737],{},"opencode auth",". A provider key read\nfrom the environment needs its variable in ",[561,740,634],{},[557,742,743,640,745,547],{},[594,744,639],{},[561,746,747],{},"opencode run -- \"say hi\"",[586,749,751],{"label":750},"Amp",[554,752,753,774],{},[557,754,755,757,758,761,762,764,765,768,769,700,772,547],{},[594,756,618],{}," On a machine where you ran ",[561,759,760],{},"amp login",", do nothing more: the\nlogin lives under your home directory, which a worker keeps. A\n",[530,763,695],{"href":347}," repository never sees it,\nbecause its workers get a home of their own. There, and on any other\nmachine, create an access token (",[561,766,767],{},"sgamp_...",") at ampcode.com\u002Fsettings and\nname ",[561,770,771],{},"AMP_API_KEY",[561,773,634],{},[557,775,776,640,778,781],{},[594,777,639],{},[561,779,780],{},"amp -x \"say hi\"",". Without credentials, Amp prints a device-login\nprompt and waits about five minutes for a browser before it exits 1, so a\nhang on that prompt means the credentials did not reach the worker.",[586,783,785],{"label":784},"Antigravity",[554,786,787,803,823,841],{},[557,788,789,791,792,795,796,799,800,802],{},[594,790,618],{}," On the machine that runs Kraft, run ",[561,793,794],{},"agy"," once in a terminal and\nsign in with your Google account. A headless run never signs in by itself:\nit needs that cached sign-in. The tokens live in the OS keychain and the\nCLI's state under ",[561,797,798],{},"~\u002F.gemini\u002Fantigravity-cli\u002F",", both of which a worker\nkeeps. A ",[530,801,695],{"href":347}," worker reaches\nneither, and Kraft has not run Antigravity in a sandbox.",[557,804,805,808,809,812,813,816,817,661,820,822],{},[594,806,807],{},"Gemini API key."," Instead of the sign-in, set ",[561,810,811],{},"\"modelProvider\": \"gemini\"","\nin ",[561,814,815],{},"~\u002F.gemini\u002Fantigravity-cli\u002Fsettings.json"," and name ",[561,818,819],{},"GEMINI_API_KEY",[561,821,634],{},". This path is untested in Kraft.",[557,824,825,828,829,832,833,836,837,840],{},[594,826,827],{},"Model."," Name a base model and an effort, such as ",[561,830,831],{},"model: gemini-3.8-flash"," with ",[561,834,835],{},"effort: low",", so the dollar caps can price the\nsession. ",[561,838,839],{},"agy models"," lists the models your account has.",[557,842,843,640,845,547],{},[594,844,639],{},[561,846,847],{},"agy -p \"say hi\"",[586,849,851],{"label":850},"Gemini CLI",[554,852,853,863],{},[557,854,855,857,858,661,860,862],{},[594,856,618],{}," A Gemini API key or Gemini Code Assist: name ",[561,859,819],{},[561,861,634],{},". An individual Google account (free, Google AI Pro or\nUltra) does not work: use the Antigravity tab.",[557,864,865,640,867,711,870,873],{},[594,866,639],{},[561,868,869],{},"gemini --skip-trust -p \"say hi\"",[561,871,872],{},"--skip-trust"," trusts the directory you are in for that session.",[549,875,877],{"id":876},"_2-pass-a-key-to-the-worker","2. Pass a key to the worker",[526,879,880,881,700,883,887],{},"Skip this step when your harness's tab needs no variable. A worker's environment is an allowlist: a variable reaches it only when the repo's ",[561,882,634],{},[530,884,885],{"href":301},[561,886,300],{}," names it. To pass a key:",[889,890,891,896,916],"ol",{},[557,892,893,894,547],{},"Name its variable in the repo's ",[561,895,634],{},[557,897,898,899,902,903,906,907,910,911,915],{},"Export it in the shell that starts the Kraft server. ",[594,900,901],{},"Running Kraft as a service?"," The service's environment is fixed when ",[561,904,905],{},"install-service"," writes it, so an ",[561,908,909],{},"export"," in your shell never reaches a worker. Set the variable in the service instead, as ",[530,912,914],{"href":913},"\u002Fguides\u002Frun\u002Frun-as-a-service#give-the-service-an-environment","Give the service an environment"," shows.",[557,917,918],{},"Restart the server.",[920,921,927],"pre",{"className":922,"code":923,"filename":924,"language":925,"meta":926,"style":926},"language-yaml shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","repos:\n  - path: \u002Fpath\u002Fto\u002Frepo\n    env_passthrough: [AMP_API_KEY]\n","config\u002Frepos.yaml","yaml","",[561,928,929,942,958],{"__ignoreMap":926},[930,931,934,938],"span",{"class":932,"line":933},"line",1,[930,935,937],{"class":936},"sb7M8","repos",[930,939,941],{"class":940},"s7iLA",":\n",[930,943,945,948,951,954],{"class":932,"line":944},2,[930,946,947],{"class":940},"  - ",[930,949,950],{"class":936},"path",[930,952,953],{"class":940},": ",[930,955,957],{"class":956},"semJd","\u002Fpath\u002Fto\u002Frepo\n",[930,959,961,964,967,969],{"class":932,"line":960},3,[930,962,963],{"class":936},"    env_passthrough",[930,965,966],{"class":940},": [",[930,968,771],{"class":956},[930,970,971],{"class":940},"]\n",[549,973,975],{"id":974},"check-it-worked","Check it worked",[889,977,978,985],{},[557,979,980,981,984],{},"Run your tab's ",[594,982,983],{},"Check"," command by hand, as the same user that runs the Kraft server. It prints an answer and exits, and does not ask you to log in. Under a service this proves only that your shell has the key: it does not prove the service has it, so read item 2.",[557,986,987,988,990,991,994],{},"File a small work item with a task on the harness, as ",[530,989,123],{"href":124}," shows, and read its log with ",[561,992,993],{},"kraft view logs ID",". A login failure shows there as the CLI's own message: Kraft adds no text of its own. Amp's is in its tab.",[549,996,998],{"id":997},"next-steps","Next steps",[554,1000,1001,1006,1011],{},[557,1002,1003,1005],{},[530,1004,123],{"href":124},": move a chain's tasks onto the harness you gave a login.",[557,1007,1008,1010],{},[530,1009,410],{"href":411},": what each harness can and cannot do.",[557,1012,1013,1015],{},[530,1014,127],{"href":128},": add an agent CLI Kraft does not ship.",[1017,1018,1019],"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":926,"searchDepth":944,"depth":944,"links":1021},[1022,1023,1024,1025,1026],{"id":551,"depth":944,"text":552},{"id":573,"depth":944,"text":574},{"id":876,"depth":944,"text":877},{"id":974,"depth":944,"text":975},{"id":997,"depth":944,"text":998},"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.","md",null,{},true,{"title":135,"description":1027},"M3ukLXEQPPUXLe7go2p95A1sVcVwRdBgy_C8h3oghMk",[1035,1037],{"title":131,"path":132,"stem":133,"description":1036,"children":-1},"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.",{"title":144,"path":145,"stem":146,"description":1038,"children":-1},"Approve or reject a gate from a phone, over Tailscale, a tunnel or a reverse proxy you run, using the same password auth as the local board, get back if Kraft does not restart, and rotate the token.",1791801171096]