[{"data":1,"prerenderedAt":1935},["ShallowReactive",2],{"navigation_docs":3,"-get-started-first-work-item":520,"-get-started-first-work-item-surround":1930},[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":21,"body":522,"description":1923,"extension":1924,"links":1925,"meta":1926,"navigation":1927,"path":22,"seo":1928,"stem":23,"__hash__":1929},"docs\u002F1.get-started\u002F2.first-work-item.md",{"type":523,"value":524,"toc":1905},"minimark",[525,545,562,567,570,628,651,655,674,688,692,695,700,707,736,739,750,756,760,766,787,798,820,835,849,864,890,894,935,939,953,967,981,985,990,1026,1032,1054,1060,1073,1088,1094,1098,1113,1130,1135,1144,1158,1165,1170,1204,1214,1228,1252,1256,1261,1335,1341,1346,1350,1358,1401,1404,1429,1442,1451,1479,1495,1521,1538,1544,1558,1586,1592,1601,1622,1639,1643,1660,1690,1701,1710,1719,1742,1759,1764,1767,1788,1793,1868,1872,1901],[526,527,528,529,534,535,539,540,544],"p",{},"Start Kraft, connect a repo, run a work item end to end, and approve the gates\nthat stand in its way. A\n",[530,531,533],"a",{"href":532},"\u002Fconcepts\u002Fvocabulary#work-item","work item"," runs through a\n",[530,536,538],{"href":537},"\u002Fconcepts\u002Fvocabulary#chain","chain"," of nodes, and some nodes are\n",[530,541,543],{"href":542},"\u002Fconcepts\u002Fvocabulary#gate","gates"," where you decide.",[526,546,547,548,552,553,556,557,561],{},"Steps 1 to 5, on the ",[549,550,551],"code",{},"quick-task"," chain, take about fifteen minutes, most of it\nspent waiting on an agent. Steps 6 and 7 run the ",[549,554,555],{},"default"," chain to a merged\npull request. They take longer, because they wait for your approvals, CI, and\nthe ",[530,558,560],{"href":559},"\u002Fconcepts\u002Fvocabulary#forge","forge",".",[563,564,566],"h2",{"id":565},"before-you-start","Before you start",[526,568,569],{},"You need:",[571,572,573,583,610,625],"ul",{},[574,575,576,577,580,581,561],"li",{},"Kraft installed, with a git identity set and Kraft registered with Claude Code\n(the plugin, or ",[549,578,579],{},"kraft admin init","), and Claude Code logged in. See\n",[530,582,17],{"href":18},[574,584,585,586,589,590,593,594,597,598,597,601,604,605,609],{},"A git repo to work on, with at least one commit (",[549,587,588],{},"git log -1"," shows it: a work\nitem's branch starts from one) and a committed ",[549,591,592],{},".gitignore"," covering build\noutput and caches (",[549,595,596],{},"__pycache__\u002F",", ",[549,599,600],{},"node_modules\u002F",[549,602,603],{},"target\u002F"," and the like).\nAfter each agent task, Kraft commits every file the agent left in the ",[530,606,608],{"href":607},"\u002Fconcepts\u002Fvocabulary#worktree","worktree","\nthat git does not ignore.",[574,611,612,613,616,617,620,621,624],{},"A git identity in that repo: ",[549,614,615],{},"git config user.name"," and\n",[549,618,619],{},"git config user.email"," both print a value there. If the repo overrides the\nidentity ",[530,622,17],{"href":623},"\u002Fget-started\u002Finstall#before-you-start"," checked, check it\nagain here.",[574,626,627],{},"A test command for the repo. Step 2 has Kraft propose one.",[629,630,632,633,636,637,640,641,644,645,648,649,561],"note",{"title":631},"Doing this from Claude Code instead","Step 2 recommends ",[549,634,635],{},"\u002Fkraft:onboard",". Steps 3 to 7 have slash commands as well:\n",[549,638,639],{},"\u002Fkraft:handoff"," to file work, ",[549,642,643],{},"\u002Fkraft:board"," to see it, ",[549,646,647],{},"\u002Fkraft:gates"," to\napprove. See ",[530,650,72],{"href":73},[563,652,654],{"id":653},"_1-start-the-server","1. Start the server",[526,656,657,658,661,662,665,666,669,670,673],{},"The server you started in ",[530,659,17],{"href":660},"\u002Fget-started\u002Finstall#start-the-server","\nmust still be running, in its own terminal. If it is not, start it again with\n",[549,663,664],{},"kraft",", which prints ",[549,667,668],{},"kraft: http:\u002F\u002F127.0.0.1:8765",", and leave it running. With no repo connected yet, the board shows three\nsetup steps: ",[530,671,672],{"href":65},"the setup wizard on first start","\ndescribes them, and step 2 does the same job from a terminal or your agent. Do\neverything that follows in a second terminal.",[526,675,676,677,680,681,683,684,561],{},"You know it worked when ",[549,678,679],{},"http:\u002F\u002F127.0.0.1:8765"," opens the board. If ",[549,682,664],{}," refuses to start,\nsee ",[530,685,687],{"href":686},"\u002Ftroubleshooting\u002Fstarting-and-reaching-kraft#kraft-wont-start-port-already-in-use","Kraft won't start: port already in use",[563,689,691],{"id":690},"_2-connect-a-repo","2. Connect a repo",[526,693,694],{},"Connect it from your coding agent, or from a terminal.",[696,697,699],"h3",{"id":698},"from-your-agent-recommended","From your agent (recommended)",[526,701,702,703,706],{},"Open a Claude Code session in the repo you want Kraft to work on. This needs the\nKraft plugin from ",[530,704,17],{"href":705},"\u002Fget-started\u002Finstall#claude-code",":",[708,709,714],"pre",{"className":710,"code":711,"language":712,"meta":713,"style":713},"language-bash shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","cd ~\u002Fcode\u002Fmy-project\nclaude\n","bash","",[549,715,716,729],{"__ignoreMap":713},[717,718,721,725],"span",{"class":719,"line":720},"line",1,[717,722,724],{"class":723},"ssYy9","cd",[717,726,728],{"class":727},"semJd"," ~\u002Fcode\u002Fmy-project\n",[717,730,732],{"class":719,"line":731},2,[717,733,735],{"class":734},"szw1H","claude\n",[526,737,738],{},"Then, in the session:",[708,740,745],{"className":741,"code":743,"language":744,"meta":713},[742],"language-text","\u002Fkraft:onboard\n","text",[549,746,747],{"__ignoreMap":713},[717,748,743],{"className":749},[719],[526,751,752,753,755],{},"Follow what it asks. It connects the repo and makes sure Kraft knows how to set\nit up and run its tests, so your first work item doesn't stop on a wrong guess.\nThe plugin also registers Kraft's MCP server with Claude Code, so there is no\n",[549,754,579],{}," step on this path.",[696,757,759],{"id":758},"from-a-terminal","From a terminal",[526,761,762,763,765],{},"Registered Kraft with Claude Code in ",[530,764,17],{"href":705},"?\nSkip that: it is once per machine. If not, do it there first. Then connect the\nrepo from the repo's directory:",[708,767,769],{"className":710,"code":768,"language":712,"meta":713,"style":713},"cd ~\u002Fcode\u002Fmy-project\nkraft repo connect\n",[549,770,771,777],{"__ignoreMap":713},[717,772,773,775],{"class":719,"line":720},[717,774,724],{"class":723},[717,776,728],{"class":727},[717,778,779,781,784],{"class":719,"line":731},[717,780,664],{"class":734},[717,782,783],{"class":727}," repo",[717,785,786],{"class":727}," connect\n",[526,788,789,790,793,794,797],{},"Kraft reads the repo's own task runner, lockfiles and CI config to propose two\ncommands: how to prepare a fresh checkout (",[549,791,792],{},"setup_command",") and how to run the\ntests (",[549,795,796],{},"test_command","). It says which commit it read, prints each command with\nthe file it came from, and lists the other candidates it found:",[708,799,802],{"className":800,"code":801,"language":744,"meta":713},[742],"connected: \u002Fhome\u002Fyou\u002Fcode\u002Fmy-project\n  read from origin\u002Fmain, where work items start\ntest command: uv run pytest (from uv.lock)\nsetup command: uv sync (from uv.lock)\n",[549,803,804,808,812,816],{"__ignoreMap":713},[717,805,807],{"className":806},[719],"connected: \u002Fhome\u002Fyou\u002Fcode\u002Fmy-project\n",[717,809,811],{"className":810},[719],"  read from origin\u002Fmain, where work items start\n",[717,813,815],{"className":814},[719],"test command: uv run pytest (from uv.lock)\n",[717,817,819],{"className":818},[719],"setup command: uv sync (from uv.lock)\n",[526,821,822,823,826,827,830,831,834],{},"The ",[549,824,825],{},"read from"," line names ",[549,828,829],{},"HEAD"," instead when the repo has no ",[549,832,833],{},"origin",". In a\nterminal, Kraft asks first, before it prints anything else, when it found more\nthan one candidate for a command or none:",[571,836,837,840,843],{},[574,838,839],{},"Enter keeps the proposal (or leaves the command unset).",[574,841,842],{},"A number picks a candidate.",[574,844,845,848],{},[549,846,847],{},"-"," means none.",[526,850,851,852,855,856,859,860,863],{},"To check the two commands before your first item does, run\n",[549,853,854],{},"kraft repo connect --verify",". It runs both once in a throwaway worktree, and\nends with ",[549,857,858],{},"verify: passed",", or with\n",[549,861,862],{},"verify: failed -- fix the entry in repos.yaml and run again"," and exit 1.\nA test that fails in the repo itself ends the same way, with the entry\nright.",[526,865,866,867,871,872,875,876,879,880,882,883,886,887,889],{},"Change them in Settings › Repos, then ",[868,869,870],"strong",{},"Review & publish"," (or in\n",[549,873,874],{},"~\u002F.kraft\u002Fconfig\u002Frepos.yaml","). If the repo needs no preparation, tick\n",[868,877,878],{},"No setup needed"," there, then ",[868,881,870],{}," (or set\n",[549,884,885],{},"setup_command: \"\"","). See ",[530,888,300],{"href":301}," for every\nfield.",[696,891,893],{"id":892},"if-connect-finds-no-test-or-setup-command","If connect finds no test or setup command",[526,895,896,899,900,903,904,907,908,911,912,918,919,925,926,930,931,934],{},[549,897,898],{},"kraft repo connect"," says so when it finds no test command or no setup command.\nNeither stops the connect, and each stops the repo's first work item if you leave it. With no test command Kraft saves the repo with ",[549,901,902],{},"enabled: false",", so ",[549,905,906],{},"kraft repo list"," shows it as ",[549,909,910],{},"disabled"," below. See\n",[530,913,915],{"href":914},"\u002Ftroubleshooting\u002Fstop-reasons-in-detail#declares-neither-test_scopes-nor-test_command",[549,916,917],{},"declares neither test_scopes nor test_command","\nand ",[530,920,922],{"href":921},"\u002Ftroubleshooting\u002Fstop-reasons-in-detail#no-setup_command-declared",[549,923,924],{},"no setup_command declared",".\n",[530,927,929],{"href":928},"\u002Freference\u002Fconfiguration\u002Frepos\u002Fconnect-proposals#when-connect-finds-no-command","When connect finds no command","\nhas the cases, including a ",[549,932,933],{},"pyproject.toml"," with no lockfile.",[696,936,938],{"id":937},"check-that-the-repo-is-connected","Check that the repo is connected",[526,940,941,942,944,945,948,949,952],{},"On either path, you know it worked when ",[549,943,906],{}," shows the repo, with ",[549,946,947],{},"enabled"," in the\nSTATE column and a ",[549,950,951],{},"*"," in the first column when you are standing in it:",[708,954,956],{"className":710,"code":955,"language":712,"meta":713,"style":713},"kraft repo list\n",[549,957,958],{"__ignoreMap":713},[717,959,960,962,964],{"class":719,"line":720},[717,961,664],{"class":734},[717,963,783],{"class":727},[717,965,966],{"class":727}," list\n",[708,968,971],{"className":969,"code":970,"language":744,"meta":713},[742],"   NAME        STATE    CHAIN    PATH\n*  my-project  enabled  default  \u002Fhome\u002Fyou\u002Fcode\u002Fmy-project\n",[549,972,973,977],{"__ignoreMap":713},[717,974,976],{"className":975},[719],"   NAME        STATE    CHAIN    PATH\n",[717,978,980],{"className":979},[719],"*  my-project  enabled  default  \u002Fhome\u002Fyou\u002Fcode\u002Fmy-project\n",[563,982,984],{"id":983},"_3-file-your-first-work-item","3. File your first work item",[526,986,822,987,989],{},[549,988,551],{}," chain has no gates, which makes it good for confirming the\npipes are connected:",[708,991,993],{"className":710,"code":992,"language":712,"meta":713,"style":713},"kraft item create \"fix the flaky import test\" --chain quick-task \\\n  --description \"It's the datetime import, not the fixture.\"\n",[549,994,995,1018],{"__ignoreMap":713},[717,996,997,999,1002,1005,1008,1011,1014],{"class":719,"line":720},[717,998,664],{"class":734},[717,1000,1001],{"class":727}," item",[717,1003,1004],{"class":727}," create",[717,1006,1007],{"class":727}," \"fix the flaky import test\"",[717,1009,1010],{"class":723}," --chain",[717,1012,1013],{"class":727}," quick-task",[717,1015,1017],{"class":1016},"sklAV"," \\\n",[717,1019,1020,1023],{"class":719,"line":731},[717,1021,1022],{"class":723},"  --description",[717,1024,1025],{"class":727}," \"It's the datetime import, not the fixture.\"\n",[526,1027,1028,1029,706],{},"It prints the new item. Copy its ",[549,1030,1031],{},"id",[708,1033,1036],{"className":1034,"code":1035,"language":744,"meta":713},[742],"id            9d0ab38ff3c9439b90506df0f6966660   \u003C- the ID\nstatus        paused\ntitle         fix the flaky import test\nbead_warning  bd is not installed: [Errno 2] No such file or directory: 'bd'\n",[549,1037,1038,1042,1046,1050],{"__ignoreMap":713},[717,1039,1041],{"className":1040},[719],"id            9d0ab38ff3c9439b90506df0f6966660   \u003C- the ID\n",[717,1043,1045],{"className":1044},[719],"status        paused\n",[717,1047,1049],{"className":1048},[719],"title         fix the flaky import test\n",[717,1051,1053],{"className":1052},[719],"bead_warning  bd is not installed: [Errno 2] No such file or directory: 'bd'\n",[526,1055,1056,1057,561],{},"You can list IDs again any time with ",[549,1058,1059],{},"kraft view list",[526,1061,1062,1065,1066,1072],{},[549,1063,1064],{},"bead_warning: bd is not installed"," means Kraft could not file a matching\n",[530,1067,1071],{"href":1068,"rel":1069},"https:\u002F\u002Fgithub.com\u002Fgastownhall\u002Fbeads",[1070],"nofollow","beads"," issue. beads is optional; the work\nitem is filed and runs the same without it, so you can ignore the line.",[526,1074,1075,1076,1079,1080,1083,1084,1087],{},"The item lands ",[868,1077,1078],{},"paused",", because ",[549,1081,1082],{},"item create"," starts nothing unless you add\n",[549,1085,1086],{},"--autostart",". Nothing has spent a token yet.",[526,1089,1090,1091,1093],{},"You know it worked when the item's status is ",[549,1092,1078],{},". If the command is\nrefused because the repo is not connected, run step 2 first.",[563,1095,1097],{"id":1096},"_4-start-it-and-watch","4. Start it, and watch",[526,1099,1100,1101,1104,1105,1108,1109,1112],{},"Replace ",[549,1102,1103],{},"ID"," with the one you copied. ",[549,1106,1107],{},"resume"," takes the item's ID, which you\ncan leave off only when you run the command inside that item's worktree. It is\nthe CLI twin of ",[868,1110,1111],{},"Start"," in the board's side panel.",[708,1114,1116],{"className":710,"code":1115,"language":712,"meta":713,"style":713},"kraft item resume ID\n",[549,1117,1118],{"__ignoreMap":713},[717,1119,1120,1122,1124,1127],{"class":719,"line":720},[717,1121,664],{"class":734},[717,1123,1001],{"class":727},[717,1125,1126],{"class":727}," resume",[717,1128,1129],{"class":727}," ID\n",[526,1131,1132,1134],{},[549,1133,1107],{}," answers with the item it started:",[708,1136,1139],{"className":1137,"code":1138,"language":744,"meta":713},[742],"started 9d0ab38ff3c9439b90506df0f6966660\n",[549,1140,1141],{"__ignoreMap":713},[717,1142,1138],{"className":1143},[719],[526,1145,1146,1147,1149,1150,1153,1154,1157],{},"While it runs, ",[549,1148,1059],{}," shows its status and node. To watch it work,\nopen the board in your browser, or run ",[549,1151,1152],{},"kraft view watch"," in a third terminal. ",[549,1155,1156],{},"watch"," takes no ID, redraws a live board on every event, and\nholds its terminal until you press Ctrl-C. The web board looks like this:",[526,1159,1160],{},[1161,1162],"img",{"alt":1163,"src":1164},"The Kraft board: work items grouped by Needs you, Running, Not started, and Done","\u002Fassets\u002Fboard.png",[526,1166,822,1167,1169],{},[530,1168,230],{"href":231}," reference describes each screen in the picture.",[526,1171,1172,1174,1175,1178,1179,1182,1183,1186,1187,1189,1190,1193,1194,1196,1197,1199,1200,1203],{},[549,1173,551],{}," runs ",[549,1176,1177],{},"implementation",", then ",[549,1180,1181],{},"verify",", with no gate. If the agent's\nfix is good, the item reaches ",[868,1184,1185],{},"Done"," on its own. ",[549,1188,1181],{}," runs the repo's own\n",[549,1191,1192],{},"test_scopes"," or ",[549,1195,796],{}," from ",[549,1198,300],{},". If a test fails, the item\nstops and waits for you. Its stop reason names the failing command and its\nscope, and ",[549,1201,1202],{},"kraft view logs ID"," shows that command's output.",[526,1205,1206,1207,1209,1210,1213],{},"When it is done, ",[549,1208,1059],{}," shows the item with the status ",[549,1211,1212],{},"completed","\n(the NODE column is the last node it entered):",[708,1215,1218],{"className":1216,"code":1217,"language":744,"meta":713},[742],"ID                                STATUS     GATE  NODE    TITLE\n9d0ab38ff3c9439b90506df0f6966660  completed  -     verify  fix the flaky import test\n",[549,1219,1220,1224],{"__ignoreMap":713},[717,1221,1223],{"className":1222},[719],"ID                                STATUS     GATE  NODE    TITLE\n",[717,1225,1227],{"className":1226},[719],"9d0ab38ff3c9439b90506df0f6966660  completed  -     verify  fix the flaky import test\n",[526,1229,1230,1231,1233,1234,1236,1237,1239,1240,1243,1244,1247,1248,1251],{},"You know it worked when the board shows the item under ",[868,1232,1185],{},", and\n",[549,1235,1059],{}," shows its status as ",[549,1238,1212],{},". A failure shows as\n",[549,1241,1242],{},"needs_human",", under ",[868,1245,1246],{},"Needs you",": see ",[530,1249,192],{"href":1250},"#troubleshooting","\nbelow.",[563,1253,1255],{"id":1254},"_5-where-is-my-change","5. Where is my change?",[526,1257,1258,1260],{},[549,1259,551],{}," opens no pull request: the change stays on the item's own branch,\nin its worktree. To see it, run one of these with the item's ID:",[1262,1263,1264,1277],"table",{},[1265,1266,1267],"thead",{},[1268,1269,1270,1274],"tr",{},[1271,1272,1273],"th",{},"Command",[1271,1275,1276],{},"What it does",[1278,1279,1280,1291,1305],"tbody",{},[1268,1281,1282,1288],{},[1283,1284,1285],"td",{},[549,1286,1287],{},"kraft view diff ID",[1283,1289,1290],{},"Prints the change, against the base branch.",[1268,1292,1293,1298],{},[1283,1294,1295],{},[549,1296,1297],{},"kraft repo path ID",[1283,1299,1300,1301,1304],{},"Prints the worktree's path. ",[549,1302,1303],{},"cd \"$(kraft repo path ID)\""," goes there.",[1268,1306,1307,1312],{},[1283,1308,1309],{},[549,1310,1311],{},"kraft repo open ID",[1283,1313,1314,1315,1318,1319,597,1322,597,1325,597,1328,1193,1331,1334],{},"Opens the worktree in your default editor: the one set in Settings, else ",[549,1316,1317],{},"$KRAFT_EDITOR",", else the OS default app, which needs a desktop session. ",[549,1320,1321],{},"--editor code",[549,1323,1324],{},"cursor",[549,1326,1327],{},"zed",[549,1329,1330],{},"obsidian",[549,1332,1333],{},"system"," picks one.",[526,1336,1337,1338,1340],{},"Merge the branch yourself, or run the next piece of work on ",[549,1339,555],{},", which\nopens and merges a pull request for you.",[526,1342,676,1343,1345],{},[549,1344,1287],{}," prints the agent's change.",[563,1347,1349],{"id":1348},"_6-try-the-real-chain-and-its-gates","6. Try the real chain, and its gates",[526,1351,1352,1354,1355,1357],{},[549,1353,555],{}," opens and merges a pull request through your forge. Steps 1 to 5 work\nwithout any of this; before you start ",[549,1356,555],{},", the repo needs:",[571,1359,1360,1372,1391],{},[574,1361,1362],{},[868,1363,1364,1365,1193,1368,1371],{},"A GitHub or GitLab remote, with ",[549,1366,1367],{},"gh",[549,1369,1370],{},"glab"," logged in.",[574,1373,1374,1377,1378,1381,1382,1385,1386,1390],{},[868,1375,1376],{},"CI that runs on pull requests."," Kraft waits for the merge request's checks\nto pass. On GitHub, a pull request with no checks at all reads as \"no checks\nyet\" and stays pending, so ",[549,1379,1380],{},"merge_request_feedback"," waits until its 90-minute\ncap and then stops and waits for you. A repo with no CI can set\n",[549,1383,1384],{},"ci_checks: false"," on its entry in\n",[530,1387,1388],{"href":301},[549,1389,300],{}," to skip both CI waits, before\nand after the merge.",[574,1392,1393,1396,1397,1400],{},[868,1394,1395],{},"A review rule only if you can meet it."," ",[549,1398,1399],{},"external_approval"," waits while a\nbranch rule requires an approving review. GitHub does not let you approve your\nown pull request, so on a solo repo with such a rule it waits until you remove\nthe rule or someone else approves. With no such rule it passes straight away,\nso a solo developer needs nothing here.",[526,1402,1403],{},"Check the forge first:",[708,1405,1407],{"className":710,"code":1406,"language":712,"meta":713,"style":713},"kraft admin doctor\ngh auth status\n",[549,1408,1409,1419],{"__ignoreMap":713},[717,1410,1411,1413,1416],{"class":719,"line":720},[717,1412,664],{"class":734},[717,1414,1415],{"class":727}," admin",[717,1417,1418],{"class":727}," doctor\n",[717,1420,1421,1423,1426],{"class":719,"line":731},[717,1422,1367],{"class":734},[717,1424,1425],{"class":727}," auth",[717,1427,1428],{"class":727}," status\n",[526,1430,1431,1434,1435,1438,1439,1441],{},[549,1432,1433],{},"gh auth status"," (or ",[549,1436,1437],{},"glab auth status",") reports you as logged in. In the\ndoctor output, the repo's ",[549,1440,560],{}," row reads like this:",[708,1443,1446],{"className":1444,"code":1445,"language":744,"meta":713},[742],"ok    forge my-project  github · gh\n",[549,1447,1448],{"__ignoreMap":713},[717,1449,1445],{"className":1450},[719],[526,1452,1453,1454,1193,1456,1458,1459,1461,1462,1465,1466,1469,1470,871,1472,1474,1475,561],{},"It fails if ",[549,1455,1367],{},[549,1457,1370],{}," is missing, or if the repo had no GitHub or GitLab\n",[549,1460,833],{}," when you connected it. For the second, set ",[549,1463,1464],{},"forge: github"," or\n",[549,1467,1468],{},"forge: gitlab"," on the repo in Settings › Repos and ",[868,1471,870],{},[549,1473,300],{},"). For a waiting item, see\n",[530,1476,1478],{"href":1477},"\u002Ftroubleshooting\u002Fwhy-did-my-item-stop#waiting-on-ci-or-a-review","Waiting on CI or a review",[526,1480,1481,1483,1484,1487,1488,1491,1492,1494],{},[549,1482,555],{}," is the chain most work runs on, and the default for ",[549,1485,1486],{},"--chain"," unless\nthe repo sets ",[549,1489,1490],{},"default_chain",", so you can leave the flag off here. Give ",[549,1493,1107],{},"\nthe new item's ID, not the first one's:",[708,1496,1498],{"className":710,"code":1497,"language":712,"meta":713,"style":713},"kraft item create \"add a --dry-run flag to the sync command\"\nkraft item resume ID\n",[549,1499,1500,1511],{"__ignoreMap":713},[717,1501,1502,1504,1506,1508],{"class":719,"line":720},[717,1503,664],{"class":734},[717,1505,1001],{"class":727},[717,1507,1004],{"class":727},[717,1509,1510],{"class":727}," \"add a --dry-run flag to the sync command\"\n",[717,1512,1513,1515,1517,1519],{"class":719,"line":731},[717,1514,664],{"class":734},[717,1516,1001],{"class":727},[717,1518,1126],{"class":727},[717,1520,1129],{"class":727},[526,1522,1523,1524,1178,1527,1178,1530,1533,1534,1537],{},"Before any code is written it stops at three gates, one after another:\n",[549,1525,1526],{},"spec_approval",[549,1528,1529],{},"plan_approval",[549,1531,1532],{},"chain_revision_approval",". The last\nis about the chain itself: an agent checks the approved spec and plan against\nthe nodes still to run and proposes changes to them, and when it proposes none,\nwhich is usual, the gate passes without asking you. Each gate shows up under\n",[1535,1536,1246],"em",{}," on the board. Open one to read the document it is about:",[526,1539,1540],{},[1161,1541],{"alt":1542,"src":1543},"A spec an agent wrote, rendered on the item's review page and waiting for your approval, with Request changes and Approve","\u002Fassets\u002Fgate.png",[526,1545,1546,1549,1550,1553,1554,1557],{},[549,1547,1548],{},"kraft view artifact ID"," reads the document the gate is about, and\n",[549,1551,1552],{},"kraft item approve ID"," approves it, as ",[868,1555,1556],{},"Approve"," does at the gate on the\nitem's page:",[708,1559,1561],{"className":710,"code":1560,"language":712,"meta":713,"style":713},"kraft view artifact ID\nkraft item approve ID\n",[549,1562,1563,1575],{"__ignoreMap":713},[717,1564,1565,1567,1570,1573],{"class":719,"line":720},[717,1566,664],{"class":734},[717,1568,1569],{"class":727}," view",[717,1571,1572],{"class":727}," artifact",[717,1574,1129],{"class":727},[717,1576,1577,1579,1581,1584],{"class":719,"line":731},[717,1578,664],{"class":734},[717,1580,1001],{"class":727},[717,1582,1583],{"class":727}," approve",[717,1585,1129],{"class":727},[526,1587,1588,1591],{},[549,1589,1590],{},"approve"," names the gate it approved and says where the item is now:",[708,1593,1596],{"className":1594,"code":1595,"language":744,"meta":713},[742],"approved spec_approval on 9d0ab38ff3c9439b90506df0f6966660; the item is now running\n",[549,1597,1598],{"__ignoreMap":713},[717,1599,1595],{"className":1600},[719],[526,1602,1603,1604,1607,1608,1611,1612,1615,1616,1233,1619,1621],{},"To send it back instead, run ",[549,1605,1606],{},"kraft item reject ID --note \"...\"",", or use\n",[868,1609,1610],{},"Reject…"," at the gate on the item's page. The node that wrote the document\nruns again with your note. ",[868,1613,1614],{},"Request changes"," on the review page, the button in\nthe picture, sends the gate back the same way, with your summary and review\nthreads as the note: it is ",[549,1617,1618],{},"kraft item review ID request-changes",[530,1620,76],{"href":77}," covers it.",[526,1623,1624,1625,1627,1628,1631,1632,1634,1635,1638],{},"You know it worked when, after your last approval, the item moves out of\n",[1535,1626,1246],{}," and into ",[1535,1629,1630],{},"Running",", and the board shows implementation started.\nImplementation and tests take a while: the item comes back under ",[1535,1633,1246],{}," at\n",[549,1636,1637],{},"local_review",", which is step 7.",[563,1640,1642],{"id":1641},"_7-review-before-it-merges","7. Review before it merges",[526,1644,1645,1646,1648,1649,1652,1653,1656,1657,1659],{},"After implementation and verification, the item stops at ",[549,1647,1637],{},", and\nlater at ",[549,1650,1651],{},"final_review",". Each comes with a diff to read first.\n",[549,1654,1655],{},"kraft view diff ID --stat"," shows how big it is, and ",[549,1658,1287],{}," shows\nthe full diff:",[708,1661,1663],{"className":710,"code":1662,"language":712,"meta":713,"style":713},"kraft view diff ID --stat\nkraft view diff ID\n",[549,1664,1665,1680],{"__ignoreMap":713},[717,1666,1667,1669,1671,1674,1677],{"class":719,"line":720},[717,1668,664],{"class":734},[717,1670,1569],{"class":727},[717,1672,1673],{"class":727}," diff",[717,1675,1676],{"class":727}," ID",[717,1678,1679],{"class":723}," --stat\n",[717,1681,1682,1684,1686,1688],{"class":719,"line":731},[717,1683,664],{"class":734},[717,1685,1569],{"class":727},[717,1687,1673],{"class":727},[717,1689,1129],{"class":727},[526,1691,1692,1693,1696,1697,1700],{},"Kraft commits after every task, so by a gate the change is already on the\nitem's branch. The diff opens with ",[868,1694,1695],{},"the change under review",": every commit\nsince the base, the item's spec and plan documents among them. Below it,\n",[868,1698,1699],{},"uncommitted"," lists whatever an agent left in the worktree without\ncommitting. \"(nothing uncommitted)\" there is normal, not an empty review.",[526,1702,1703,1704,1706,1707,1709],{},"Approve ",[549,1705,1637],{}," and Kraft opens a draft merge request and runs CI and\nautomated review on it. Approve ",[549,1708,1651],{}," and it marks the request ready,\nwaits for the merge request's external approval on your forge, then merges.",[526,1711,1712,1713,1715,1716,1718],{},"Run ",[549,1714,1552],{}," at each gate, once you have read the diff, and\n",[549,1717,1059],{}," to see the item's status:",[708,1720,1722],{"className":710,"code":1721,"language":712,"meta":713,"style":713},"kraft item approve ID\nkraft view list\n",[549,1723,1724,1734],{"__ignoreMap":713},[717,1725,1726,1728,1730,1732],{"class":719,"line":720},[717,1727,664],{"class":734},[717,1729,1001],{"class":727},[717,1731,1583],{"class":727},[717,1733,1129],{"class":727},[717,1735,1736,1738,1740],{"class":719,"line":731},[717,1737,664],{"class":734},[717,1739,1569],{"class":727},[717,1741,966],{"class":727},[526,1743,1744,1745,1747,1748,1750,1751,1753,1754,1756,1757,561],{},"Each ",[549,1746,1590],{}," prints a line like that, naming the gate it approved. You know it worked\nwhen ",[549,1749,1059],{}," shows the item's status as ",[549,1752,1212],{}," and the merge\nrequest shows as merged on your forge. If it stays under ",[1535,1755,1246],{}," at a gate\nyou approved, or at a later one, see ",[530,1758,192],{"href":1250},[526,1760,1761,1762,561],{},"What each gate does, and how caps and waits bound the chain, is in\n",[530,1763,36],{"href":37},[563,1765,192],{"id":1766},"troubleshooting",[526,1768,1769,1770,1772,1773,1776,1777,1779,1780,1783,1784,1787],{},"An item that stops shows under ",[868,1771,1246],{}," with a reason. Read it with\n",[549,1774,1775],{},"kraft view show ID",", then the log of the session that stopped it with\n",[549,1778,1202],{},", then check the install with ",[549,1781,1782],{},"kraft admin doctor",". In\nClaude Code, ",[549,1785,1786],{},"\u002Fkraft:triage"," does this for you, and offers to retry, raise a cap,\nor hand the item back to you.",[526,1789,1790,1792],{},[530,1791,192],{"href":193}," maps every stop reason to its fix. These four\nare the ones a first run most often hits:",[1262,1794,1795,1805],{},[1265,1796,1797],{},[1268,1798,1799,1802],{},[1271,1800,1801],{},"It stops with",[1271,1803,1804],{},"The fix is in",[1278,1806,1807,1821,1835,1851],{},[1268,1808,1809,1815],{},[1283,1810,1811,1814],{},[549,1812,1813],{},"... nothing registers it for Claude Code ...",", at its first agent step with 0 tokens spent.",[1283,1816,1817],{},[530,1818,1820],{"href":1819},"\u002Ftroubleshooting\u002Fwhy-did-my-item-stop#a-task-kraft-would-not-launch","A task Kraft would not launch",[1268,1822,1823,1829],{},[1283,1824,1825,1828],{},[549,1826,1827],{},"no setup_command declared for \u003Crepo> in repos.yaml ...",", before its first node runs.",[1283,1830,1831],{},[530,1832,1833],{"href":921},[549,1834,924],{},[1268,1836,1837,1845],{},[1283,1838,1839,1840,1842,1843,561],{},"A config error at its test node: the repo declares neither ",[549,1841,1192],{}," nor ",[549,1844,796],{},[1283,1846,1847],{},[530,1848,1849],{"href":914},[549,1850,917],{},[1268,1852,1853,1862],{},[1283,1854,1855,1857,1858,1861],{},[549,1856,1782],{}," fails its ",[549,1859,1860],{},"agent: claude"," row.",[1283,1863,1864],{},[530,1865,1867],{"href":1866},"\u002Ftroubleshooting\u002Fdoctor-failures#the-agent-row-and-the-service-path","The agent row and the service PATH",[563,1869,1871],{"id":1870},"next-steps","Next steps",[571,1873,1874,1879,1891,1896],{},[574,1875,1876,1878],{},[530,1877,76],{"href":77},": comment on a work item and approve or send back a gate, from the web UI or the CLI.",[574,1880,1881,1883,1884,1887,1888,1890],{},[530,1882,164],{"href":165},": keep the server running in the background and start it at login, with ",[549,1885,1886],{},"kraft admin install-service","; ",[549,1889,664],{}," in a terminal stops when you close it.",[574,1892,1893,1895],{},[530,1894,102],{"href":103},": change what runs between filing and merge.",[574,1897,1898,1900],{},[530,1899,144],{"href":145},": approve a gate from your phone.",[1902,1903,1904],"style",{},"html pre.shiki code .ssYy9, html code.shiki .ssYy9{--shiki-light:#023B95;--shiki-default:#023B95;--shiki-dark:#91CBFF}html pre.shiki code .semJd, html code.shiki .semJd{--shiki-light:#032563;--shiki-default:#032563;--shiki-dark:#ADDCFF}html pre.shiki code .szw1H, html code.shiki .szw1H{--shiki-light:#702C00;--shiki-default:#702C00;--shiki-dark:#FFB757}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 .sklAV, html code.shiki .sklAV{--shiki-light:#A0111F;--shiki-default:#A0111F;--shiki-dark:#FF9492}",{"title":713,"searchDepth":731,"depth":731,"links":1906},[1907,1908,1909,1916,1917,1918,1919,1920,1921,1922],{"id":565,"depth":731,"text":566},{"id":653,"depth":731,"text":654},{"id":690,"depth":731,"text":691,"children":1910},[1911,1913,1914,1915],{"id":698,"depth":1912,"text":699},3,{"id":758,"depth":1912,"text":759},{"id":892,"depth":1912,"text":893},{"id":937,"depth":1912,"text":938},{"id":983,"depth":731,"text":984},{"id":1096,"depth":731,"text":1097},{"id":1254,"depth":731,"text":1255},{"id":1348,"depth":731,"text":1349},{"id":1641,"depth":731,"text":1642},{"id":1766,"depth":731,"text":192},{"id":1870,"depth":731,"text":1871},"Start Kraft, connect a repo, run a work item end to end, and approve its gates.","md",null,{},true,{"title":21,"description":1923},"Hgqc0BCEtnXPNtdKhQJHZEO9LXbNz3OJEss5yg9wMzw",[1931,1933],{"title":17,"path":18,"stem":19,"description":1932,"children":-1},"Install Kraft with uv, Homebrew, the install script, or from source, start the server, register it with Claude Code, and check that it works.",{"title":25,"path":26,"stem":27,"description":1934,"children":-1},"Short answers on forges, harnesses, cost, supported platforms, writing a spec, sharing chains with add-ons, Kraft Lite and approving tool calls.",1791801166152]