[{"data":1,"prerenderedAt":1409},["ShallowReactive",2],{"navigation_docs":3,"-get-started-the-real-chain":551,"-get-started-the-real-chain-surround":1404},[4,32,55,206,237,516],{"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],{"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,"children":59},"Guides","\u002Fguides","3.guides",[60,62,100,126,148,202],{"title":10,"path":57,"stem":61},"3.guides\u002Findex",{"title":63,"path":64,"stem":65,"children":66},"Day to day","\u002Fguides\u002Fday-to-day","3.guides\u002F1.day-to-day\u002Findex",[67,68,72,76,80,84,88,92,96],{"title":10,"path":64,"stem":65},{"title":69,"path":70,"stem":71},"The setup wizard on first start","\u002Fguides\u002Fday-to-day\u002Ffirst-run","3.guides\u002F1.day-to-day\u002F2.first-run",{"title":73,"path":74,"stem":75},"File a work item","\u002Fguides\u002Fday-to-day\u002Ffile-a-work-item","3.guides\u002F1.day-to-day\u002F3.file-a-work-item",{"title":77,"path":78,"stem":79},"Use Kraft from your agent","\u002Fguides\u002Fday-to-day\u002Fagent-integration","3.guides\u002F1.day-to-day\u002F4.agent-integration",{"title":81,"path":82,"stem":83},"Reviewing a change","\u002Fguides\u002Fday-to-day\u002Freview-a-change","3.guides\u002F1.day-to-day\u002F5.review-a-change",{"title":85,"path":86,"stem":87},"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":89,"path":90,"stem":91},"Kraft for VS Code","\u002Fguides\u002Fday-to-day\u002Fvscode","3.guides\u002F1.day-to-day\u002F7.vscode",{"title":93,"path":94,"stem":95},"Kraft on a phone","\u002Fguides\u002Fday-to-day\u002Fkraft-on-a-phone","3.guides\u002F1.day-to-day\u002F8.kraft-on-a-phone",{"title":97,"path":98,"stem":99},"Get notified when an item needs you","\u002Fguides\u002Fday-to-day\u002Fnotifications","3.guides\u002F1.day-to-day\u002F9.notifications",{"title":101,"path":102,"stem":103,"children":104},"Customize and automate","\u002Fguides\u002Fcustomize","3.guides\u002F2.customize\u002Findex",[105,106,110,114,118,122],{"title":10,"path":102,"stem":103},{"title":107,"path":108,"stem":109},"Write your own chain","\u002Fguides\u002Fcustomize\u002Fwrite-your-own-chain","3.guides\u002F2.customize\u002F1.write-your-own-chain",{"title":111,"path":112,"stem":113},"Add a security review or a gate reviewer","\u002Fguides\u002Fcustomize\u002Fadd-review-agents","3.guides\u002F2.customize\u002F2.add-review-agents",{"title":115,"path":116,"stem":117},"Schedule or webhook work","\u002Fguides\u002Fcustomize\u002Fschedule-and-webhook-work","3.guides\u002F2.customize\u002F3.schedule-and-webhook-work",{"title":119,"path":120,"stem":121},"Share chains with add-ons","\u002Fguides\u002Fcustomize\u002Fshare-chains-with-addons","3.guides\u002F2.customize\u002F4.share-chains-with-addons",{"title":123,"path":124,"stem":125},"Publish an add-on","\u002Fguides\u002Fcustomize\u002Fpublish-an-add-on","3.guides\u002F2.customize\u002F5.publish-an-add-on",{"title":127,"path":128,"stem":129,"children":130},"Agents and harnesses","\u002Fguides\u002Fharnesses","3.guides\u002F3.harnesses\u002Findex",[131,132,136,140,144],{"title":10,"path":128,"stem":129},{"title":133,"path":134,"stem":135},"Switch a task to another harness","\u002Fguides\u002Fharnesses\u002Fswitch-harness","3.guides\u002F3.harnesses\u002F1.switch-harness",{"title":137,"path":138,"stem":139},"Add or override a harness","\u002Fguides\u002Fharnesses\u002Fadding-a-harness","3.guides\u002F3.harnesses\u002F2.adding-a-harness",{"title":141,"path":142,"stem":143},"Build a worker Kit","\u002Fguides\u002Fharnesses\u002Fworker-kit","3.guides\u002F3.harnesses\u002F3.worker-kit",{"title":145,"path":146,"stem":147},"Give a worker its login","\u002Fguides\u002Fharnesses\u002Fgive-a-worker-its-login","3.guides\u002F3.harnesses\u002F4.give-a-worker-its-login",{"title":149,"path":150,"stem":151,"children":152},"Run the server","\u002Fguides\u002Frun","3.guides\u002F4.run\u002Findex",[153,154,158,162,166,170,174,178,182,186,190,194,198],{"title":10,"path":150,"stem":151},{"title":155,"path":156,"stem":157},"Remote access","\u002Fguides\u002Frun\u002Fremote-access","3.guides\u002F4.run\u002F01.remote-access",{"title":159,"path":160,"stem":161},"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":163,"path":164,"stem":165},"Restart Kraft without ending running agents","\u002Fguides\u002Frun\u002Frestart-kraft","3.guides\u002F4.run\u002F03.restart-kraft",{"title":167,"path":168,"stem":169},"Back up and restore the database","\u002Fguides\u002Frun\u002Fback-up-and-restore","3.guides\u002F4.run\u002F04.back-up-and-restore",{"title":171,"path":172,"stem":173},"Logs and disk space","\u002Fguides\u002Frun\u002Flogs-and-disk-space","3.guides\u002F4.run\u002F05.logs-and-disk-space",{"title":175,"path":176,"stem":177},"Run Kraft as a service","\u002Fguides\u002Frun\u002Frun-as-a-service","3.guides\u002F4.run\u002F06.run-as-a-service",{"title":179,"path":180,"stem":181},"Upgrade Kraft","\u002Fguides\u002Frun\u002Fupgrade-kraft","3.guides\u002F4.run\u002F07.upgrade-kraft",{"title":183,"path":184,"stem":185},"Upgrade your configuration","\u002Fguides\u002Frun\u002Fupgrade-your-configuration","3.guides\u002F4.run\u002F08.upgrade-your-configuration",{"title":187,"path":188,"stem":189},"Upgrade from 1.4","\u002Fguides\u002Frun\u002Fupgrade-from-1-4","3.guides\u002F4.run\u002F09.upgrade-from-1-4",{"title":191,"path":192,"stem":193},"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":195,"path":196,"stem":197},"Roll back to 1.4","\u002Fguides\u002Frun\u002Froll-back","3.guides\u002F4.run\u002F11.roll-back",{"title":199,"path":200,"stem":201},"Run items in your own checkout","\u002Fguides\u002Frun\u002Frun-items-in-place","3.guides\u002F4.run\u002F12.run-items-in-place",{"title":203,"path":204,"stem":205},"Kraft Lite","\u002Fguides\u002Fkraft-lite","3.guides\u002F5.kraft-lite",{"title":207,"path":208,"stem":209,"children":210},"Troubleshooting","\u002Ftroubleshooting","4.troubleshooting",[211,213,217,221,225,229,233],{"title":10,"path":208,"stem":212},"4.troubleshooting\u002Findex",{"title":214,"path":215,"stem":216},"Why did my item stop?","\u002Ftroubleshooting\u002Fwhy-did-my-item-stop","4.troubleshooting\u002F1.why-did-my-item-stop",{"title":218,"path":219,"stem":220},"Stop reasons in detail","\u002Ftroubleshooting\u002Fstop-reasons-in-detail","4.troubleshooting\u002F2.stop-reasons-in-detail",{"title":222,"path":223,"stem":224},"Starting and reaching Kraft","\u002Ftroubleshooting\u002Fstarting-and-reaching-kraft","4.troubleshooting\u002F3.starting-and-reaching-kraft",{"title":226,"path":227,"stem":228},"Doctor failures","\u002Ftroubleshooting\u002Fdoctor-failures","4.troubleshooting\u002F4.doctor-failures",{"title":230,"path":231,"stem":232},"Sandbox and Kit stops","\u002Ftroubleshooting\u002Fsandbox-and-kit-stops","4.troubleshooting\u002F5.sandbox-and-kit-stops",{"title":234,"path":235,"stem":236},"Add-on problems","\u002Ftroubleshooting\u002Faddon-problems","4.troubleshooting\u002F6.addon-problems",{"title":238,"path":239,"stem":240,"children":241},"Reference","\u002Freference","5.reference",[242,244,286,308,312,316,414,432,458,462,466,500,504,508,512],{"title":10,"path":239,"stem":243},"5.reference\u002Findex",{"title":245,"path":246,"stem":247,"children":248},"Web UI","\u002Freference\u002Fweb-ui","5.reference\u002F00.web-ui\u002Findex",[249,250,254,258,262,266,270,274,278,282],{"title":10,"path":246,"stem":247},{"title":251,"path":252,"stem":253},"Sidebar, search, and keyboard","\u002Freference\u002Fweb-ui\u002Fsidebar-search-and-keyboard","5.reference\u002F00.web-ui\u002F0.sidebar-search-and-keyboard",{"title":255,"path":256,"stem":257},"The board","\u002Freference\u002Fweb-ui\u002Fboard","5.reference\u002F00.web-ui\u002F1.board",{"title":259,"path":260,"stem":261},"An item's page","\u002Freference\u002Fweb-ui\u002Fitem-page","5.reference\u002F00.web-ui\u002F2.item-page",{"title":263,"path":264,"stem":265},"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":267,"path":268,"stem":269},"Config before an item starts","\u002Freference\u002Fweb-ui\u002Fconfig-before-start","5.reference\u002F00.web-ui\u002F4.config-before-start",{"title":271,"path":272,"stem":273},"The review page","\u002Freference\u002Fweb-ui\u002Freview-page","5.reference\u002F00.web-ui\u002F5.review-page",{"title":275,"path":276,"stem":277},"Templates and Settings","\u002Freference\u002Fweb-ui\u002Ftemplates-and-settings","5.reference\u002F00.web-ui\u002F6.templates-and-settings",{"title":279,"path":280,"stem":281},"Analytics","\u002Freference\u002Fweb-ui\u002Fanalytics","5.reference\u002F00.web-ui\u002F7.analytics",{"title":283,"path":284,"stem":285},"Cap stops and raises","\u002Freference\u002Fweb-ui\u002Fcap-stops-and-raises","5.reference\u002F00.web-ui\u002F8.cap-stops-and-raises",{"title":287,"path":288,"stem":289,"children":290},"CLI","\u002Freference\u002Fcli","5.reference\u002F01.cli\u002Findex",[291,292,296,300,304],{"title":10,"path":288,"stem":289},{"title":293,"path":294,"stem":295},"Item verbs","\u002Freference\u002Fcli\u002Fitem","5.reference\u002F01.cli\u002F2.item",{"title":297,"path":298,"stem":299},"View verbs","\u002Freference\u002Fcli\u002Fview","5.reference\u002F01.cli\u002F3.view",{"title":301,"path":302,"stem":303},"Repo verbs","\u002Freference\u002Fcli\u002Frepo","5.reference\u002F01.cli\u002F4.repo",{"title":305,"path":306,"stem":307},"Admin verbs","\u002Freference\u002Fcli\u002Fadmin","5.reference\u002F01.cli\u002F5.admin",{"title":309,"path":310,"stem":311},"Console","\u002Freference\u002Fconsole","5.reference\u002F01.console",{"title":313,"path":314,"stem":315},"Work item statuses","\u002Freference\u002Fstatuses","5.reference\u002F02.statuses",{"title":317,"path":318,"stem":319,"children":320},"Configuration","\u002Freference\u002Fconfiguration","5.reference\u002F03.configuration\u002Findex",[321,322,340,344,348,352,356,360,364,368,402,406,410],{"title":10,"path":318,"stem":319},{"title":323,"path":324,"stem":325,"children":326},"repos.yaml","\u002Freference\u002Fconfiguration\u002Frepos","5.reference\u002F03.configuration\u002F02.repos\u002Findex",[327,328,332,336],{"title":10,"path":324,"stem":325},{"title":329,"path":330,"stem":331},"How connect proposes commands","\u002Freference\u002Fconfiguration\u002Frepos\u002Fconnect-proposals","5.reference\u002F03.configuration\u002F02.repos\u002F1.connect-proposals",{"title":333,"path":334,"stem":335},"detectors.yaml","\u002Freference\u002Fconfiguration\u002Frepos\u002Fdetectors","5.reference\u002F03.configuration\u002F02.repos\u002F2.detectors",{"title":337,"path":338,"stem":339},"Workspaces","\u002Freference\u002Fconfiguration\u002Frepos\u002Fworkspaces","5.reference\u002F03.configuration\u002F02.repos\u002F3.workspaces",{"title":341,"path":342,"stem":343},"policy.yaml","\u002Freference\u002Fconfiguration\u002Fpolicy","5.reference\u002F03.configuration\u002F03.policy",{"title":345,"path":346,"stem":347},"Library and chains","\u002Freference\u002Fconfiguration\u002Flibrary-and-chains","5.reference\u002F03.configuration\u002F04.library-and-chains",{"title":349,"path":350,"stem":351},"harnesses.yaml","\u002Freference\u002Fconfiguration\u002Fharnesses-file","5.reference\u002F03.configuration\u002F05.harnesses-file",{"title":353,"path":354,"stem":355},"access.yaml","\u002Freference\u002Fconfiguration\u002Faccess","5.reference\u002F03.configuration\u002F06.access",{"title":357,"path":358,"stem":359},"intake.yaml","\u002Freference\u002Fconfiguration\u002Fintake","5.reference\u002F03.configuration\u002F07.intake",{"title":361,"path":362,"stem":363},"notify.yaml","\u002Freference\u002Fconfiguration\u002Fnotify","5.reference\u002F03.configuration\u002F08.notify",{"title":365,"path":366,"stem":367},"theme.yaml","\u002Freference\u002Fconfiguration\u002Ftheme","5.reference\u002F03.configuration\u002F09.theme",{"title":369,"path":370,"stem":371,"children":372},"Sandboxed workers","\u002Freference\u002Fconfiguration\u002Fsandbox","5.reference\u002F03.configuration\u002F10.sandbox\u002Findex",[373,374,378,382,386,390,394,398],{"title":10,"path":370,"stem":371},{"title":375,"path":376,"stem":377},"Resource limits","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fresource-limits","5.reference\u002F03.configuration\u002F10.sandbox\u002F1.resource-limits",{"title":379,"path":380,"stem":381},"Callbacks from a sandbox","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fcallbacks","5.reference\u002F03.configuration\u002F10.sandbox\u002F2.callbacks",{"title":383,"path":384,"stem":385},"Network policy","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fnetwork-policy","5.reference\u002F03.configuration\u002F10.sandbox\u002F3.network-policy",{"title":387,"path":388,"stem":389},"Credentials","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fcredentials","5.reference\u002F03.configuration\u002F10.sandbox\u002F4.credentials",{"title":391,"path":392,"stem":393},"Kits","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fkits","5.reference\u002F03.configuration\u002F10.sandbox\u002F5.kits",{"title":395,"path":396,"stem":397},"sandbox.yaml","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fsandbox-yaml","5.reference\u002F03.configuration\u002F10.sandbox\u002F6.sandbox-yaml",{"title":399,"path":400,"stem":401},"Git in a sandbox","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fgit-in-a-sandbox","5.reference\u002F03.configuration\u002F10.sandbox\u002F7.git-in-a-sandbox",{"title":403,"path":404,"stem":405},"Environment variables","\u002Freference\u002Fconfiguration\u002Fenvironment-variables","5.reference\u002F03.configuration\u002F11.environment-variables",{"title":407,"path":408,"stem":409},"Add-ons and collections","\u002Freference\u002Fconfiguration\u002Faddons","5.reference\u002F03.configuration\u002F12.addons",{"title":411,"path":412,"stem":413},"Repo libraries","\u002Freference\u002Fconfiguration\u002Frepo-libraries","5.reference\u002F03.configuration\u002F13.repo-libraries",{"title":415,"path":416,"stem":417,"children":418},"Chain file keys","\u002Freference\u002Fchain-nodes","5.reference\u002F04.chain-nodes\u002Findex",[419,420,424,428],{"title":10,"path":416,"stem":417},{"title":421,"path":422,"stem":423},"Subprocess tasks","\u002Freference\u002Fchain-nodes\u002Fsubprocess-tasks","5.reference\u002F04.chain-nodes\u002F2.subprocess-tasks",{"title":425,"path":426,"stem":427},"Fix loop and judge","\u002Freference\u002Fchain-nodes\u002Ffix-loop","5.reference\u002F04.chain-nodes\u002F3.fix-loop",{"title":429,"path":430,"stem":431},"Result file","\u002Freference\u002Fchain-nodes\u002Fresult-file","5.reference\u002F04.chain-nodes\u002F4.result-file",{"title":433,"path":434,"stem":435,"children":436},"Agent harnesses","\u002Freference\u002Fharnesses","5.reference\u002F05.harnesses\u002Findex",[437,438,442,446,450,454],{"title":10,"path":434,"stem":435},{"title":439,"path":440,"stem":441},"Unattended runs","\u002Freference\u002Fharnesses\u002Funattended-runs","5.reference\u002F05.harnesses\u002F2.unattended-runs",{"title":443,"path":444,"stem":445},"Agent profiles","\u002Freference\u002Fharnesses\u002Fagent-profiles","5.reference\u002F05.harnesses\u002F3.agent-profiles",{"title":447,"path":448,"stem":449},"Harness definition files","\u002Freference\u002Fharnesses\u002Fharness-files","5.reference\u002F05.harnesses\u002F4.harness-files",{"title":451,"path":452,"stem":453},"Fallback and escalation","\u002Freference\u002Fharnesses\u002Ffallback-and-escalation","5.reference\u002F05.harnesses\u002F5.fallback-and-escalation",{"title":455,"path":456,"stem":457},"Cost reporting","\u002Freference\u002Fharnesses\u002Fcost-reporting","5.reference\u002F05.harnesses\u002F6.cost-reporting",{"title":459,"path":460,"stem":461},"Permission gate","\u002Freference\u002Fpermissions","5.reference\u002F06.permissions",{"title":463,"path":464,"stem":465},"Inbound triggers","\u002Freference\u002Ftriggers","5.reference\u002F07.triggers",{"title":467,"path":468,"stem":469,"children":470},"HTTP API","\u002Freference\u002Fhttp-api","5.reference\u002F08.http-api\u002Findex",[471,472,476,480,484,488,492,496],{"title":10,"path":468,"stem":469},{"title":473,"path":474,"stem":475},"Filing, reading and changing work items","\u002Freference\u002Fhttp-api\u002Fwork-items","5.reference\u002F08.http-api\u002F2.work-items",{"title":477,"path":478,"stem":479},"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":481,"path":482,"stem":483},"The work item object","\u002Freference\u002Fhttp-api\u002Fwork-item-object","5.reference\u002F08.http-api\u002F4.work-item-object",{"title":485,"path":486,"stem":487},"Budget, events, diff and documents","\u002Freference\u002Fhttp-api\u002Fbudget-and-events","5.reference\u002F08.http-api\u002F5.budget-and-events",{"title":489,"path":490,"stem":491},"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":493,"path":494,"stem":495},"Drafts","\u002Freference\u002Fhttp-api\u002Fdrafts","5.reference\u002F08.http-api\u002F7.drafts",{"title":497,"path":498,"stem":499},"Ops for each draft area","\u002Freference\u002Fhttp-api\u002Fdraft-ops","5.reference\u002F08.http-api\u002F8.draft-ops",{"title":501,"path":502,"stem":503},"MCP tools","\u002Freference\u002Fmcp-tools","5.reference\u002F09.mcp-tools",{"title":505,"path":506,"stem":507},"Events","\u002Freference\u002Fevents","5.reference\u002F10.events",{"title":509,"path":510,"stem":511},"VS Code extension","\u002Freference\u002Fvscode-extension","5.reference\u002F11.vscode-extension",{"title":513,"path":514,"stem":515},"Changes from 1.4 to 2.0","\u002Freference\u002Fchanges-from-1-4","5.reference\u002F12.changes-from-1-4",{"title":517,"path":518,"stem":519,"children":520},"Project","\u002Fproject","6.project",[521,523,527,531,535,539,543,547],{"title":10,"path":518,"stem":522},"6.project\u002Findex",{"title":524,"path":525,"stem":526},"Security","\u002Fproject\u002Fsecurity","6.project\u002F1.security",{"title":528,"path":529,"stem":530},"Data and privacy","\u002Fproject\u002Fdata-and-privacy","6.project\u002F2.data-and-privacy",{"title":532,"path":533,"stem":534},"What's new in 2.0","\u002Fproject\u002Fwhats-new","6.project\u002F3.whats-new",{"title":536,"path":537,"stem":538},"Status and support","\u002Fproject\u002Fstatus-and-support","6.project\u002F4.status-and-support",{"title":540,"path":541,"stem":542},"Architecture","\u002Fproject\u002Farchitecture","6.project\u002F5.architecture",{"title":544,"path":545,"stem":546},"Source map","\u002Fproject\u002Fsource-map","6.project\u002F6.source-map",{"title":548,"path":549,"stem":550},"Contributing","\u002Fproject\u002Fcontributing","6.project\u002F7.contributing",{"id":552,"title":25,"body":553,"description":1397,"extension":1398,"links":1399,"meta":1400,"navigation":1401,"path":26,"seo":1402,"stem":27,"__hash__":1403},"docs\u002F1.get-started\u002F3.the-real-chain.md",{"type":554,"value":555,"toc":1384},"minimark",[556,588,594,599,606,611,631,635,643,688,693,696,732,745,756,787,804,834,853,860,874,902,908,917,939,956,960,965,992,996,1014,1045,1056,1065,1075,1099,1119,1124,1128,1132,1135,1245,1248,1251,1255,1270,1338,1347,1351,1380],[557,558,559,563,564,568,569,573,574,577,578,582,583,587],"p",{},[560,561,562],"strong",{},"Part 2 of 2."," ",[565,566,567],"a",{"href":22},"Part 1"," ran a work item on\n",[570,571,572],"code",{},"quick-task",", which has no gates. This page runs the ",[570,575,576],{},"default"," chain to a merged\npull request. It takes longer, because it waits for your approvals, CI, and the\n",[565,579,581],{"href":580},"\u002Fconcepts\u002Fvocabulary#forge","forge",". A ",[565,584,586],{"href":585},"\u002Fconcepts\u002Fvocabulary#gate","gate"," is a\nnode where you decide.",[557,589,590,591,593],{},"This part has its own two steps. Start the server and connect the repo in\n",[565,592,567],{"href":22}," first (its steps 1 and 2).",[595,596,598],"h2",{"id":597},"the-chain-you-are-about-to-run","The chain you are about to run",[557,600,601,602,605],{},"Each line is a node of ",[570,603,604],{},"config\u002Fchains\u002Fdefault.yaml",", in order. The three\napproval gates before the code is written, and the two reviews after, are where\nthe chain stops for you.",[607,608],"diagram-flow",{":stages":609,"caption":610},"[{\"name\":\"spec\"},{\"name\":\"spec_approval\",\"gate\":\"you approve\",\"note\":\"reject re-runs spec\"},{\"name\":\"plan\"},{\"name\":\"plan_approval\",\"gate\":\"you approve\",\"note\":\"reject re-runs plan\"},{\"name\":\"chain_revision\",\"note\":\"proposes changes to the nodes still to run, usually none\"},{\"name\":\"chain_revision_approval\",\"gate\":\"only if it proposed changes\",\"note\":\"reject re-runs chain_revision\"},{\"name\":\"implementation\"},{\"name\":\"verification\",\"loop\":\"fix loop\",\"note\":\"your tests, then a code review\"},{\"name\":\"work_brief\"},{\"name\":\"local_review\",\"gate\":\"you approve\",\"note\":\"reject re-runs implementation\"},{\"name\":\"describe_merge_request\"},{\"name\":\"draft_merge_request\",\"note\":\"rebase, then open a draft\"},{\"name\":\"merge_request_feedback\",\"loop\":\"fix loop\",\"note\":\"CI and automated review\"},{\"name\":\"work_item_summary\"},{\"name\":\"final_review\",\"gate\":\"you approve\",\"note\":\"reject re-runs implementation\"},{\"name\":\"mark_ready\"},{\"name\":\"external_approval\",\"note\":\"waits for your forge's required approval, if any\"},{\"name\":\"merge\"},{\"name\":\"post_merge_ci\",\"note\":\"waits for the post-merge pipeline\"}]","The default chain's 19 nodes in order. Gates stop it for a person: spec_approval, plan_approval, local_review and final_review always, and chain_revision_approval only when the revision proposes a change. verification and merge_request_feedback each run a fix loop. A rejection at a spec, plan or revision gate re-runs the node that wrote the document; a rejection at local_review or final_review re-runs implementation.",[612,613,615,616,619,620,623,624,627,628,630],"note",{"title":614},"Doing this from Claude Code instead","Both steps have slash commands too: ",[570,617,618],{},"\u002Fkraft:handoff"," to file work,\n",[570,621,622],{},"\u002Fkraft:board"," to see it, ",[570,625,626],{},"\u002Fkraft:gates"," to approve. See\n",[565,629,77],{"href":78},".",[595,632,634],{"id":633},"_1-try-the-real-chain-and-its-gates","1. Try the real chain, and its gates",[557,636,637,639,640,642],{},[570,638,576],{}," opens and merges a pull request through your forge. Part 1 works\nwithout any of this; before you start ",[570,641,576],{},", the repo needs:",[644,645,646,660,679],"ul",{},[647,648,649],"li",{},[560,650,651,652,655,656,659],{},"A GitHub or GitLab remote, with ",[570,653,654],{},"gh"," or ",[570,657,658],{},"glab"," logged in.",[647,661,662,665,666,669,670,673,674,678],{},[560,663,664],{},"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 ",[570,667,668],{},"merge_request_feedback"," waits until its 90-minute\ncap and then stops and waits for you. A repo with no CI can set\n",[570,671,672],{},"ci_checks: false"," on its entry in\n",[565,675,676],{"href":324},[570,677,323],{}," to skip both CI waits, before\nand after the merge.",[647,680,681,563,684,687],{},[560,682,683],{},"A review rule only if you can meet it.",[570,685,686],{},"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.",[689,690,692],"h3",{"id":691},"check-the-forge","Check the forge",[557,694,695],{},"Check the forge before you start:",[697,698,703],"pre",{"className":699,"code":700,"language":701,"meta":702,"style":702},"language-bash shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","kraft admin doctor\ngh auth status\n","bash","",[570,704,705,721],{"__ignoreMap":702},[706,707,710,714,718],"span",{"class":708,"line":709},"line",1,[706,711,713],{"class":712},"szw1H","kraft",[706,715,717],{"class":716},"semJd"," admin",[706,719,720],{"class":716}," doctor\n",[706,722,724,726,729],{"class":708,"line":723},2,[706,725,654],{"class":712},[706,727,728],{"class":716}," auth",[706,730,731],{"class":716}," status\n",[557,733,734,737,738,741,742,744],{},[570,735,736],{},"gh auth status"," (or ",[570,739,740],{},"glab auth status",") reports you as logged in. In the\ndoctor output, the repo's ",[570,743,581],{}," row reads like this:",[697,746,751],{"className":747,"code":749,"language":750,"meta":702},[748],"language-text","ok    forge my-project  github · gh\n","text",[570,752,753],{"__ignoreMap":702},[706,754,749],{"className":755},[708],[557,757,758,759,655,761,763,764,767,768,771,772,775,776,779,780,782,783,630],{},"It fails if ",[570,760,654],{},[570,762,658],{}," is missing, or if the repo had no GitHub or GitLab\n",[570,765,766],{},"origin"," when you connected it. For the second, set ",[570,769,770],{},"forge: github"," or\n",[570,773,774],{},"forge: gitlab"," on the repo in Settings › Repos and ",[560,777,778],{},"Review & publish"," (or in\n",[570,781,323],{},"). For a waiting item, see\n",[565,784,786],{"href":785},"\u002Ftroubleshooting\u002Fwhy-did-my-item-stop#waiting-on-ci-or-a-review","Waiting on CI or a review",[557,788,789,791,792,795,796,799,800,803],{},[570,790,576],{}," is the chain most work runs on, and the default for ",[570,793,794],{},"--chain"," unless\nthe repo sets ",[570,797,798],{},"default_chain",", so you can leave the flag off here. Give ",[570,801,802],{},"resume","\nthe new item's ID, not the first one's:",[697,805,807],{"className":699,"code":806,"language":701,"meta":702,"style":702},"kraft item create \"add a --dry-run flag to the sync command\"\nkraft item resume ID\n",[570,808,809,822],{"__ignoreMap":702},[706,810,811,813,816,819],{"class":708,"line":709},[706,812,713],{"class":712},[706,814,815],{"class":716}," item",[706,817,818],{"class":716}," create",[706,820,821],{"class":716}," \"add a --dry-run flag to the sync command\"\n",[706,823,824,826,828,831],{"class":708,"line":723},[706,825,713],{"class":712},[706,827,815],{"class":716},[706,829,830],{"class":716}," resume",[706,832,833],{"class":716}," ID\n",[557,835,836,837,840,841,840,844,847,848,852],{},"Before any code is written it stops at three gates, one after another:\n",[570,838,839],{},"spec_approval",", then ",[570,842,843],{},"plan_approval",[570,845,846],{},"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",[849,850,851],"em",{},"Needs you"," on the board. Open one to read the document it is about:",[557,854,855],{},[856,857],"img",{"alt":858,"src":859},"The gate's review page headed Approve spec: Request changes and Approve buttons in the header, a Waiting for you mark, a line saying Approving starts plan with the gates left and the spend, the spec an agent wrote rendered below, and the files on the branch with one pending comment","\u002Fassets\u002Fgate.png",[557,861,862,865,866,869,870,873],{},[570,863,864],{},"kraft view artifact ID"," reads the document the gate is about, and\n",[570,867,868],{},"kraft item approve ID"," approves it, as ",[560,871,872],{},"Approve"," does at the gate on the\nitem's page:",[697,875,877],{"className":699,"code":876,"language":701,"meta":702,"style":702},"kraft view artifact ID\nkraft item approve ID\n",[570,878,879,891],{"__ignoreMap":702},[706,880,881,883,886,889],{"class":708,"line":709},[706,882,713],{"class":712},[706,884,885],{"class":716}," view",[706,887,888],{"class":716}," artifact",[706,890,833],{"class":716},[706,892,893,895,897,900],{"class":708,"line":723},[706,894,713],{"class":712},[706,896,815],{"class":716},[706,898,899],{"class":716}," approve",[706,901,833],{"class":716},[557,903,904,907],{},[570,905,906],{},"approve"," names the gate it approved and says where the item is now:",[697,909,912],{"className":910,"code":911,"language":750,"meta":702},[748],"approved spec_approval on 9d0ab38ff3c9439b90506df0f6966660; the item is now running\n",[570,913,914],{"__ignoreMap":702},[706,915,911],{"className":916},[708],[557,918,919,920,923,924,927,928,931,932,935,936,938],{},"To send it back instead, run ",[570,921,922],{},"kraft item reject ID --note \"...\"",", or use\n",[560,925,926],{},"Request changes…"," at the gate on the item's page. The node that wrote the document\nruns again with your note. ",[560,929,930],{},"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 ",[570,933,934],{},"kraft item review ID request-changes",", and\n",[565,937,81],{"href":82}," covers it.",[557,940,941,942,944,945,948,949,951,952,955],{},"You know it worked when, after your last approval, the item moves out of\n",[849,943,851],{}," and into ",[849,946,947],{},"Running",", and the board shows implementation started.\nImplementation and tests take a while: the item comes back under ",[849,950,851],{}," at\n",[570,953,954],{},"local_review",", which is step 2.",[689,957,959],{"id":958},"no-forge-or-ci","No forge or CI",[557,961,962],{},[849,963,964],{},"Added in 2.1",[557,966,967,968,970,971,973,974,977,978,980,981,983,984,986,987,991],{},"Without a GitHub or GitLab ",[570,969,766],{},", ",[570,972,576],{}," cannot open its merge request,\nand ",[570,975,976],{},"kraft admin doctor"," fails the repo's ",[570,979,581],{}," row. Part 1 needs no forge, so\nrun ",[570,982,572],{}," on such a repo and merge its branch yourself. A repo with a\nforge and no CI can set ",[570,985,672],{}," in\n",[565,988,989],{"href":324},[570,990,323],{},", as the list above says.",[595,993,995],{"id":994},"_2-review-before-it-merges","2. Review before it merges",[557,997,998,999,1001,1002,1005,1006,1009,1010,1013],{},"After implementation and verification, the item stops at ",[570,1000,954],{},", and\nlater at ",[570,1003,1004],{},"final_review",". Each comes with a diff to read first.\n",[570,1007,1008],{},"kraft view diff ID --stat"," shows how big it is, and ",[570,1011,1012],{},"kraft view diff ID"," shows\nthe full diff:",[697,1015,1017],{"className":699,"code":1016,"language":701,"meta":702,"style":702},"kraft view diff ID --stat\nkraft view diff ID\n",[570,1018,1019,1035],{"__ignoreMap":702},[706,1020,1021,1023,1025,1028,1031],{"class":708,"line":709},[706,1022,713],{"class":712},[706,1024,885],{"class":716},[706,1026,1027],{"class":716}," diff",[706,1029,1030],{"class":716}," ID",[706,1032,1034],{"class":1033},"ssYy9"," --stat\n",[706,1036,1037,1039,1041,1043],{"class":708,"line":723},[706,1038,713],{"class":712},[706,1040,885],{"class":716},[706,1042,1027],{"class":716},[706,1044,833],{"class":716},[557,1046,1047,1048,1051,1052,1055],{},"Kraft commits after every task, so by a gate the change is already on the\nitem's branch. The diff opens with ",[560,1049,1050],{},"the change under review",": every commit\nsince the base, the item's spec and plan documents among them. Below it,\n",[560,1053,1054],{},"uncommitted"," lists whatever an agent left in the worktree without\ncommitting. \"(nothing uncommitted)\" there is normal, not an empty review.",[557,1057,1058,1059,1061,1062,1064],{},"Approve ",[570,1060,954],{}," and Kraft opens a draft merge request and runs CI and\nautomated review on it. Approve ",[570,1063,1004],{}," and it marks the request ready,\nwaits for the merge request's external approval on your forge, then merges.",[557,1066,1067,1068,1070,1071,1074],{},"Run ",[570,1069,868],{}," at each gate, once you have read the diff, and\n",[570,1072,1073],{},"kraft view list"," to see the item's status:",[697,1076,1078],{"className":699,"code":1077,"language":701,"meta":702,"style":702},"kraft item approve ID\nkraft view list\n",[570,1079,1080,1090],{"__ignoreMap":702},[706,1081,1082,1084,1086,1088],{"class":708,"line":709},[706,1083,713],{"class":712},[706,1085,815],{"class":716},[706,1087,899],{"class":716},[706,1089,833],{"class":716},[706,1091,1092,1094,1096],{"class":708,"line":723},[706,1093,713],{"class":712},[706,1095,885],{"class":716},[706,1097,1098],{"class":716}," list\n",[557,1100,1101,1102,1104,1105,1107,1108,1111,1112,1114,1115,630],{},"Each ",[570,1103,906],{}," prints a line like that, naming the gate it approved. You know it worked\nwhen ",[570,1106,1073],{}," shows the item's status as ",[570,1109,1110],{},"completed"," and the merge\nrequest shows as merged on your forge. If it stays under ",[849,1113,851],{}," at a gate\nyou approved, or at a later one, see ",[565,1116,1118],{"href":1117},"#if-it-stops","If it stops",[557,1120,1121,1122,630],{},"What each gate does, and how caps and waits bound the chain, is in\n",[565,1123,40],{"href":41},[689,1125,1127],{"id":1126},"what-to-check-at-a-gate","What to check at a gate",[557,1129,1130],{},[849,1131,964],{},[557,1133,1134],{},"Each gate decides on one document. Reading it against the question below is\nenough for a first run:",[1136,1137,1138,1157],"table",{},[1139,1140,1141],"thead",{},[1142,1143,1144,1148,1151,1154],"tr",{},[1145,1146,1147],"th",{},"Gate",[1145,1149,1150],{},"You read",[1145,1152,1153],{},"Ask yourself",[1145,1155,1156],{},"Reject sends it to",[1158,1159,1160,1178,1195,1212,1229],"tbody",{},[1142,1161,1162,1167,1170,1173],{},[1163,1164,1165],"td",{},[570,1166,839],{},[1163,1168,1169],{},"the spec",[1163,1171,1172],{},"Does it say what you asked for, with nothing added you did not want?",[1163,1174,1175],{},[570,1176,1177],{},"spec",[1142,1179,1180,1184,1187,1190],{},[1163,1181,1182],{},[570,1183,843],{},[1163,1185,1186],{},"the plan",[1163,1188,1189],{},"Are the tasks in a sensible order, and do they touch the files you expect?",[1163,1191,1192],{},[570,1193,1194],{},"plan",[1142,1196,1197,1201,1204,1207],{},[1163,1198,1199],{},[570,1200,846],{},[1163,1202,1203],{},"the proposed change to the rest of the chain",[1163,1205,1206],{},"Do you want the nodes it adds, drops or changes?",[1163,1208,1209],{},[570,1210,1211],{},"chain_revision",[1142,1213,1214,1218,1221,1224],{},[1163,1215,1216],{},[570,1217,954],{},[1163,1219,1220],{},"the work brief and the diff",[1163,1222,1223],{},"Is the diff the change you wanted, with tests for it?",[1163,1225,1226],{},[570,1227,1228],{},"implementation",[1142,1230,1231,1235,1238,1241],{},[1163,1232,1233],{},[570,1234,1004],{},[1163,1236,1237],{},"the summary and the merge request",[1163,1239,1240],{},"Did CI and the automated review settle everything they raised?",[1163,1242,1243],{},[570,1244,1228],{},[557,1246,1247],{},"A rejection needs a note: the node it sends back to runs again with it.",[595,1249,1118],{"id":1250},"if-it-stops",[557,1252,1253],{},[849,1254,964],{},[557,1256,1257,1258,1260,1261,840,1264,840,1267,1269],{},"An item that stops shows under ",[849,1259,851],{}," with a reason. Read it with\n",[570,1262,1263],{},"kraft view show ID",[570,1265,1266],{},"kraft view logs ID",[570,1268,976],{},". These\nare the ones this part most often hits:",[1136,1271,1272,1282],{},[1139,1273,1274],{},[1142,1275,1276,1279],{},[1145,1277,1278],{},"It stops or waits",[1145,1280,1281],{},"The fix is in",[1158,1283,1284,1304,1314,1326],{},[1142,1285,1286,1292],{},[1163,1287,1288,1289,1291],{},"At ",[570,1290,668],{},", with the pull request open and no checks.",[1163,1293,1294,1296,1297,1299,1300,1303],{},[565,1295,786],{"href":785},", or set ",[570,1298,672],{}," (see ",[565,1301,959],{"href":1302},"#no-forge-or-ci",").",[1142,1305,1306,1311],{},[1163,1307,1288,1308,1310],{},[570,1309,686],{},", on a branch rule that needs an approving review.",[1163,1312,1313],{},"The same section: on a solo repo, remove the rule or have someone else approve.",[1142,1315,1316,1322],{},[1163,1317,1318,1319,1321],{},"At draft merge request, with the doctor's ",[570,1320,581],{}," row failing.",[1163,1323,1324,630],{},[565,1325,226],{"href":227},[1142,1327,1328,1333],{},[1163,1329,1330,1331,630],{},"At a gate you approved, still under ",[849,1332,851],{},[1163,1334,1335,1337],{},[570,1336,1263],{}," names the gate it now waits at: it may be the next one.",[557,1339,1340,1342,1343,630],{},[565,1341,207],{"href":208}," maps every other stop reason to its fix, and\na failure in Part 1's steps is covered under\n",[565,1344,1346],{"href":1345},"\u002Fget-started\u002Ffirst-work-item#troubleshooting","Part 1's troubleshooting",[595,1348,1350],{"id":1349},"next-steps","Next steps",[644,1352,1353,1358,1370,1375],{},[647,1354,1355,1357],{},[565,1356,81],{"href":82},": comment on a work item and approve or send back a gate, from the web UI or the CLI.",[647,1359,1360,1362,1363,1366,1367,1369],{},[565,1361,175],{"href":176},": keep the server running in the background and start it at login, with ",[570,1364,1365],{},"kraft admin install-service","; ",[570,1368,713],{}," in a terminal stops when you close it.",[647,1371,1372,1374],{},[565,1373,107],{"href":108},": change what runs between filing and merge.",[647,1376,1377,1379],{},[565,1378,155],{"href":156},": approve a gate from your phone.",[1381,1382,1383],"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 .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 .ssYy9, html code.shiki .ssYy9{--shiki-light:#023B95;--shiki-default:#023B95;--shiki-dark:#91CBFF}",{"title":702,"searchDepth":723,"depth":723,"links":1385},[1386,1387,1392,1395,1396],{"id":597,"depth":723,"text":598},{"id":633,"depth":723,"text":634,"children":1388},[1389,1391],{"id":691,"depth":1390,"text":692},3,{"id":958,"depth":1390,"text":959},{"id":994,"depth":723,"text":995,"children":1393},[1394],{"id":1126,"depth":1390,"text":1127},{"id":1250,"depth":723,"text":1118},{"id":1349,"depth":723,"text":1350},"Run the default chain on a repo with a forge, approve its gates, and review the change to a merged pull request.","md",null,{},true,{"title":25,"description":1397},"CuuMMRe3Dfd6BbgANEjv6EGRfxz6ci-KZXSA87X-O2U",[1405,1407],{"title":21,"path":22,"stem":23,"description":1406,"children":-1},"Start Kraft, connect a repo, and run a work item on the quick-task chain until it lands on the board.",{"title":29,"path":30,"stem":31,"description":1408,"children":-1},"Short answers on forges, harnesses, cost, supported platforms, writing a spec, sharing chains with add-ons, Kraft Lite and approving tool calls.",1792362337924]