[{"data":1,"prerenderedAt":2225},["ShallowReactive",2],{"navigation_docs":3,"-reference-changes-from-1-4":551,"-reference-changes-from-1-4-surround":2220},[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":513,"body":553,"description":2213,"extension":2214,"links":2215,"meta":2216,"navigation":2217,"path":514,"seo":2218,"stem":515,"__hash__":2219},"docs\u002F5.reference\u002F12.changes-from-1-4.md",{"type":554,"value":555,"toc":2200},"minimark",[556,564,577,580,585,684,688,824,828,1163,1176,1331,1335,1525,1546,1634,1637,1719,1744,1822,1826,1850,1854,1899,1902,1905,2033,2043,2046,2066,2079,2082,2117,2137,2140,2179,2183],[557,558,559,560,563],"p",{},"To update, see ",[561,562,187],"a",{"href":188},". This page lists what changed.",[557,565,566,567,571,572,576],{},"2.0 changes some 1.4 behavior that the\n",[561,568,570],{"href":569},"\u002Fproject\u002Fstatus-and-support#versioning-and-stability","stability policy"," covers,\nsuch as ",[573,574,575],"code",{},"--json"," fields and exit codes, which is why it is a major release.\nApart from the changes listed here, your chains, library and other config files\ncarry over as they are.",[557,578,579],{},"Each change below says what is true now, what 1.4 did, and what you do about it.\n\"No action\" means nothing to change.",[581,582,584],"h2",{"id":583},"network-access","Network access",[586,587,588,617],"ul",{},[589,590,591,595,596,599,600],"li",{},[592,593,594],"strong",{},"The Host check on a network bind."," On a network bind, 2.0 checks the\naddress every browser uses to reach the board. 1.4 skipped that check over\nplain http, so your board may have worked at a name that isn't in\n",[573,597,598],{},"allowed_hosts",". Such a browser now gets a page saying the name isn't allowed.\n",[586,601,602,611],{},[589,603,604,605,607,608,610],{},"Do: before you upgrade, add each exact name you use (no wildcards) on\nSettings › Access, or to ",[573,606,598],{}," in ",[573,609,353],{},".",[589,612,613,616],{},[573,614,615],{},"kraft admin doctor"," warns when the bind is off loopback and the list is\nempty.",[589,618,619,625,626,629,630,632,633,636,637,639,640,643,644,647,648,651,652,654,655,659,660],{},[592,620,621,622,610],{},"A tunnel or reverse proxy in front of a loopback-bound Kraft must send a\nloopback ",[573,623,624],{},"Host"," On a server bound to ",[573,627,628],{},"127.0.0.1"," (the default), 2.0\nanswers 403 to every request whose ",[573,631,624],{}," header isn't ",[573,634,635],{},"localhost",",\n",[573,638,628],{}," or ",[573,641,642],{},"[::1]",", webhooks to ",[573,645,646],{},"POST \u002Fapi\u002Ftriggers"," and\n",[573,649,650],{},"GET \u002Fapi\u002Fhealth"," included. 1.4 checked only requests from a browser, and\n",[573,653,598],{}," doesn't apply on a loopback bind. See\n",[561,656,658],{"href":657},"\u002Freference\u002Fhttp-api#who-may-call","Who may call"," for the rule.\n",[586,661,662,672],{},[589,663,664,665,667,668,610],{},"Do, for the board: bind Kraft beyond loopback, with a password, and list the\nname in ",[573,666,598],{},". That is the one way the board works through\ncloudflared, ngrok, Caddy or nginx. What a proxy you run must pass is in\n",[561,669,671],{"href":670},"\u002Fguides\u002Frun\u002Fremote-access#behind-a-reverse-proxy-you-run","Behind a reverse proxy you run",[589,673,674,675,677,678,680,681,683],{},"Do, for webhooks and scripts alone: have the proxy rewrite ",[573,676,624],{}," to\n",[573,679,635],{},". Read\n",[561,682,159],{"href":160},"\nfirst, because it also changes who has to sign in.",[581,685,687],{"id":686},"items-and-repos","Items and repos",[586,689,690,724,738,744,758,785,813],{},[589,691,692,699,700,703,704,709,710,713,714,716,717,719,720,723],{},[592,693,694,695,698],{},"A sandbox with no ",[573,696,697],{},"network:"," is refused."," Every agent launch into it stops\nthe item as a configuration error, whatever the harness. 1.4 already refused a\nClaude task there, and a Codex or Cursor task with a tool policy. It ran every\nother one, with the worker's network unrestricted and no channel to Kraft, so\ngates were not enforced. A repo that runs only Claude needs nothing done.",[701,702],"br",{},"Do: add a ",[561,705,706,708],{"href":384},[573,707,697],{}," policy","\nto the sandbox, or set ",[573,711,712],{},"unrestricted_network: true"," on it to run as 1.4 did,\nknowing that. The two keys together are refused when ",[573,715,323],{}," loads.\n",[573,718,615],{}," fails the ",[573,721,722],{},"egress"," row of each such repo.",[589,725,726,729,730,734,735,610],{},[592,727,728],{},"Cancel keeps the branch."," Cancel in the web interface keeps the item's\nbranch and ",[561,731,733],{"href":732},"\u002Fconcepts\u002Fvocabulary#worktree","worktree",". 1.4 deleted them. Do: to delete them, run\n",[573,736,737],{},"kraft item abandon ID --reason \"...\" --yes",[589,739,740,743],{},[592,741,742],{},"A merge request closed without merging stops its item."," In 1.4 the item\nkept waiting. Do: reopen the merge request from the item's page, retry, or\ncancel.",[589,745,746,749,750,753,754,757],{},[592,747,748],{},"A repo with open items can't be disconnected."," ",[573,751,752],{},"kraft repo disconnect"," (and\n",[573,755,756],{},"DELETE \u002Fapi\u002Frepos",") is refused with a 409 until each of the repo's items is\ndone, cancelled or abandoned, paused and never-started ones included. In 1.4 it\nwent through and left those items stranded. Do: finish, cancel or abandon the\nitems first.",[589,759,760,766,767,770,771,773,774,777,778,781,782,784],{},[592,761,762,765],{},[573,763,764],{},"test_command: \"\""," means the repo has no tests."," Its items pass ",[573,768,769],{},"verify","\nwithout running a test. In 1.4 such an entry stopped every item at ",[573,772,769],{},".\nDo: before you upgrade, set a real test command on any such entry, or\n",[573,775,776],{},"enabled: false"," to keep it from running. After the upgrade, the ",[573,779,780],{},"tests"," row of\n",[573,783,615],{}," names each such entry.",[589,786,787,793,794],{},[592,788,789,792],{},[573,790,791],{},"kraft repo connect"," on a repo that is already connected changes it."," In\n1.4 it did nothing. Now it probes the repo again and saves what its entry left\nundecided: a test command where it has none and no test scopes, and a setup\ncommand where none is declared.",[586,795,796,806],{},[589,797,798,799,802,803,805],{},"That can enable a repo saved disabled for want of a test command. In a\nterminal it asks first; with ",[573,800,801],{},"-y",", ",[573,804,575],{}," or no terminal it saves without\nasking.",[589,807,808,809,812],{},"Do: a script that re-runs connect to check a repo should run\n",[573,810,811],{},"kraft repo list"," instead.",[589,814,815,820,821,823],{},[592,816,817,819],{},[573,818,791],{}," refuses a repo with no commit yet."," 1.4 connected it.\nDo: commit its files first. ",[573,822,615],{}," names each entry 1.4 left\nwithout a test or setup command where 2.0 finds one, with the connect command\nthat saves it.",[581,825,827],{"id":826},"scripts-json-output-and-the-api","Scripts, JSON output and the API",[586,829,830,889,913,922,977,994,1007,1050,1073,1106],{},[589,831,832,838,839,842,843,846,847,849,850,853,854],{},[592,833,834,837],{},[573,835,836],{},"agent_overrides"," is an object, not JSON text,"," wherever it appears: in\n",[573,840,841],{},"kraft view show --json",", in ",[573,844,845],{},"kraft item approve --json"," and every other\n",[573,848,575],{}," answer that carries the item, in the MCP tools' results, and in\n",[573,851,852],{},"GET \u002Fapi\u002Fwork-items\u002F{id}",".\n",[586,855,856,872,879],{},[589,857,858,859,636,861,864,865,868,869,871],{},"In the answers to an action, such as ",[573,860,845],{},[573,862,863],{},"node_overrides"," and ",[573,866,867],{},"policy_override"," are objects too, as\n",[573,870,841],{}," already had them.",[589,873,874,875,878],{},"Do: if a script runs ",[573,876,877],{},"json.loads"," on one of them, read it as an object\ninstead.",[589,880,881,882,647,885,888],{},"Setting the override works as in 1.4: ",[573,883,884],{},"kraft item set-overrides",[573,886,887],{},"PATCH \u002Fapi\u002Fwork-items\u002F{id}"," replace the whole override.",[589,890,891,899,900,904,905,908,909,912],{},[592,892,893,607,896,898],{},[573,894,895],{},"budget_cap.cap_usd",[573,897,841],{}," is the cap that stops the\nitem first:"," the lower of its own cap and its ",[561,901,903],{"href":902},"\u002Fconcepts\u002Fvocabulary#policy","policy","'s item-wide\n",[573,906,907],{},"budget_usd",". Do: read ",[573,910,911],{},"budget_cap.key"," to tell which one it is.",[589,914,915,921],{},[592,916,917,920],{},[573,918,919],{},"kraft view events -f --json"," prints one JSON object per line"," from the\nfirst line on. 1.4 printed the backlog as an indented array. Do: read it line\nby line.",[589,923,924,749,927,802,930,802,933,636,936,802,939,802,942,802,945,802,948,802,951,802,954,647,957,802,960,864,963,966,967,639,970,973,974,976],{},[592,925,926],{},"Action commands print one line.",[573,928,929],{},"kraft item approve",[573,931,932],{},"reject",[573,934,935],{},"pause",[573,937,938],{},"resume",[573,940,941],{},"retry",[573,943,944],{},"raise-budget",[573,946,947],{},"skip",[573,949,950],{},"complete",[573,952,953],{},"cancel",[573,955,956],{},"escalate",[573,958,959],{},"set-chain",[573,961,962],{},"kraft item resolve",[573,964,965],{},"reopen"," (one line naming the thread),\nand ",[573,968,969],{},"kraft item review approve",[573,971,972],{},"request-changes"," at a pending gate, print\nwhat they did, not the item's fields (or, for a thread, its comments). Do: a\nscript that read those fields should use ",[573,975,575],{},", which is unchanged.",[589,978,979,985,986,989,990,993],{},[592,980,981,984],{},[573,982,983],{},"kraft admin restart"," with no server running exits 1."," 1.4 exited 0.\n",[573,987,988],{},"update --restart"," is unchanged. Do: a script that runs it under ",[573,991,992],{},"set -e","\nstops there, so start the server first.",[589,995,996,1003,1004,1006],{},[592,997,998,864,1000,1002],{},[573,999,983],{},[573,1001,988],{}," list the running items first.","\nIn a terminal they ask before going on (",[573,1005,801],{}," skips the question); a script\nwith no terminal only prints the list. 1.4 restarted without asking. No action.",[589,1008,1009,749,1012,1015,1016,647,1019,1022,1023,1026,1027,1030,1031,1034,1035,1038,1039,1042,1043,1045,1046,1049],{},[592,1010,1011],{},"A review comment names a file inside the repository, and a suggestion goes on\nnew-side lines.",[573,1013,1014],{},"kraft item comment",", the MCP tool ",[573,1017,1018],{},"add_review_comment",[573,1020,1021],{},"POST \u002Fapi\u002Fwork-items\u002F{id}\u002Fthreads"," refuse an absolute ",[573,1024,1025],{},"--file"," path, or one\nwith ",[573,1028,1029],{},"..",", with a ",[573,1032,1033],{},"422",", and ",[573,1036,1037],{},"kraft item comment --suggest"," with ",[573,1040,1041],{},"--side old","\nexits 2 (the API answers ",[573,1044,1033],{},"). 1.4 stored both. Do: use a repository-relative\npath, and ",[573,1047,1048],{},"--side new"," for a suggestion.",[589,1051,1052,749,1055,802,1057,802,1060,1062,1063,1066,1067,1030,1070,1072],{},[592,1053,1054],{},"A model override that is not a model id is refused.",[573,1056,884],{},[573,1058,1059],{},"kraft item set-node-override",[573,1061,887],{},"\nand a retry that changes a task's model (",[573,1064,1065],{},"task_config.model",") answer one, such\nas ",[573,1068,1069],{},"--model \"my model\"",[573,1071,1033],{},". 1.4 stored any text. One 1.4 already\nstored now stops its item at the next launch instead of reaching the agent, and\nthe reason names the command that clears it. Do: run that command.",[589,1074,1075,1078],{},[592,1076,1077],{},"Escalating an item a spend cap stopped is refused, and so is raising a cap\nto what the item has already spent.",[586,1079,1080,1094,1103],{},[589,1081,1082,1085,1086,1089,1090,1093],{},[573,1083,1084],{},"kraft item escalate"," (and ",[573,1087,1088],{},"POST \u002Fapi\u002Fwork-items\u002F{id}\u002Fescalate",") on an item\nany spend cap stopped, the daily cap included, answers ",[573,1091,1092],{},"409"," and points to\nthe cap to raise. 1.4 started an escalation that the same cap then stopped.",[589,1095,1096,1099,1100,1102],{},[573,1097,1098],{},"kraft item raise-budget"," with a cap at or below what the item has spent\nanswers ",[573,1101,1033],{},". 1.4 saved it and the item stopped again at once.",[589,1104,1105],{},"Do: raise the cap above the spend.",[589,1107,1108,749,1116,1015,1119,802,1122,864,1124,1126,1127,1129,1130,1133,1134],{},[592,1109,1110,1111,1115],{},"A ",[561,1112,1114],{"href":1113},"\u002Fconcepts\u002Fvocabulary#work-item","work item"," title is one line of plain text, and not blank.",[573,1117,1118],{},"kraft item create",[573,1120,1121],{},"create_work_item",[573,1123,646],{},[573,1125,887],{}," refuse a title that is empty, only whitespace, holds a\nline break (a trailing one included), or holds a tab, an escape or another\ncontrol character, with a ",[573,1128,1033],{},". 1.4 filed or saved it (only a blank ",[573,1131,1132],{},"PATCH","\ntitle was refused).\n",[586,1135,1136,1142,1157],{},[589,1137,1138,1139,610],{},"Do: if a webhook or script builds the title from text that can be empty or\nrun over several lines, give it a fallback and send its first line, with the\nrest in ",[573,1140,1141],{},"description",[589,1143,1144,1145,1147,1148,1152,1153,1156],{},"A schedule's title (a ",[573,1146,341],{}," cron ",[561,1149,1151],{"href":1150},"\u002Fconcepts\u002Fvocabulary#trigger","trigger"," in 1.4), and ",[592,1154,1155],{},"Duplicate","\nof an item 1.4 filed with one, is cleaned up instead of refused: the first\nline is the title and the rest goes to the top of the description, a tab\nbecomes a space, other control characters are dropped, and a blank title\ntakes the description's first line (a schedule with neither is skipped).",[589,1158,1159,1162],{},[573,1160,1161],{},"kraft view list"," shows the first line of a title 1.4 stored with a line\nbreak, without its control characters.",[557,1164,1165],{},[592,1166,1167,1168,1171,1172,1175],{},"Chains are named ",[573,1169,1170],{},"chain",", not ",[573,1173,1174],{},"template",", in commands, tools and the API.",[1177,1178,1179,1195],"table",{},[1180,1181,1182],"thead",{},[1183,1184,1185,1189,1192],"tr",{},[1186,1187,1188],"th",{},"Before",[1186,1190,1191],{},"Now",[1186,1193,1194],{},"What to do",[1196,1197,1198,1219,1244,1263,1280,1302],"tbody",{},[1183,1199,1200,1206,1216],{},[1201,1202,1203],"td",{},[573,1204,1205],{},"kraft item set-chain --template",[1201,1207,1208,1211,1212,1215],{},[573,1209,1210],{},"--chain","; ",[573,1213,1214],{},"--template"," still works",[1201,1217,1218],{},"Nothing.",[1183,1220,1221,1227,1239],{},[1201,1222,1223,1224],{},"The MCP tool ",[573,1225,1226],{},"set_chain_template",[1201,1228,1229,1232,1233,1235,1236,1238],{},[573,1230,1231],{},"set_chain",", with ",[573,1234,1170],{}," for ",[573,1237,1174],{},"; the old tool name no longer exists",[1201,1240,1241,1242,610],{},"Change an agent prompt or skill that names ",[573,1243,1226],{},[1183,1245,1246,1254,1258],{},[1201,1247,1248,1251,1252],{},[573,1249,1250],{},"chain_template"," in the MCP tool ",[573,1253,1121],{},[1201,1255,1256],{},[573,1257,1170],{},[1201,1259,1260,1261,610],{},"Use ",[573,1262,1170],{},[1183,1264,1265,1271,1278],{},[1201,1266,1267,607,1269],{},[573,1268,1250],{},[573,1270,646],{},[1201,1272,1273,1211,1275,1277],{},[573,1274,1170],{},[573,1276,1250],{}," is still read",[1201,1279,1218],{},[1183,1281,1282,1293,1300],{},[1201,1283,1284,607,1287,864,1290],{},[573,1285,1286],{},"default_chain_template",[573,1288,1289],{},"POST",[573,1291,1292],{},"PATCH \u002Fapi\u002Frepos",[1201,1294,1295,1211,1298,1277],{},[573,1296,1297],{},"default_chain",[573,1299,1286],{},[1201,1301,1218],{},[1183,1303,1304,1321,1325],{},[1201,1305,1306,1308,1309,802,1312,1015,1315,864,1318],{},[573,1307,1286],{}," in the answers of ",[573,1310,1311],{},"kraft repo list --json",[573,1313,1314],{},"kraft repo connect --json",[573,1316,1317],{},"ensure_repo",[573,1319,1320],{},"GET \u002Fapi\u002Frepos",[1201,1322,1323],{},[573,1324,1297],{},[1201,1326,1327,1328,1330],{},"Read ",[573,1329,1297],{}," in a script that uses the key.",[581,1332,1334],{"id":1333},"config-directory-and-files","Config directory and files",[586,1336,1337,1445,1470,1499],{},[589,1338,1339,1342,1343,1346,1347,1350,1351],{},[592,1340,1341],{},"The config directory."," The config directory is ",[573,1344,1345],{},"$KRAFT_HOME\u002Fconfig\u002F",", not\n",[573,1348,1349],{},"templates\u002F",". Do: nothing for a default home; the first start renames it. The\nrest of this item says what that touches.\n",[586,1352,1353,1364,1374,1401,1416,1435],{},[589,1354,1355,1356,1359,1360,1363],{},"The first start renames yours, every file in it as it was, once it holds the\nserver's lock. Started while the 1.4 server is still up, it exits \"already\nrunning\" and touches nothing. ",[573,1357,1358],{},"templates"," is left as a link to ",[573,1361,1362],{},"config",", so\na 1.4 process still running (an MCP server under an agent) and a path in a\nscript keep working.",[589,1365,1366,1369,1370,1373],{},[573,1367,1368],{},"KRAFT_CONFIG_DIR"," names it. ",[573,1371,1372],{},"KRAFT_TEMPLATES_DIR"," is still read when the new\none is unset, and one pointing at the old default is renamed with it, so a\nservice unit or a shell written for 1.4 keeps working. Change it when you\nnext touch that unit.",[589,1375,1110,1376,1379,1380,1384,1385,1388,1389,1391,1392,1394,1395,1397,1398,1400],{},[573,1377,1378],{},"config\u002F"," you made before the first start, such as the ",[561,1381,1383],{"href":1382},"\u002Fconcepts\u002Fvocabulary#harness","harness"," guide's\n",[573,1386,1387],{},"config\u002Fharnesses",", gets what it lacks moved in (an empty directory in\n",[573,1390,1349],{}," is removed). Whatever both hold stays in ",[573,1393,1349],{},", and\n",[573,1396,615],{},"'s ",[573,1399,1362],{}," row names both until you merge them.",[589,1402,1403,1404,1406,1407,1409,1410,1412,1413,1415],{},"If a service unit or a shell sets ",[573,1405,1372],{}," to the old default\nand you also made a ",[573,1408,1378],{},", 2.0 refuses to start until you merge\n",[573,1411,1349],{}," into ",[573,1414,1378],{}," and remove it.",[589,1417,1418,1419,1421,1422,1425,1426,1428,1429,1431,1432,1434],{},"A directory you point at anywhere else is never renamed. A ",[573,1420,1358],{}," that\nis a link to another directory (a dotfiles repo) is not renamed or merged\neither, and its files are not read, except a ",[573,1423,1424],{},"harnesses\u002F"," directory in it,\nwhich stays read until a ",[573,1427,1387],{}," exists. The start prints a\nwarning naming the target, and the ",[573,1430,1362],{}," row warns the same. Do: set\n",[573,1433,1368],{}," to that target.",[589,1436,1437,1440,1441,1171,1443,610],{},[573,1438,1439],{},"kraft admin doctor --json"," names the row ",[573,1442,1362],{},[573,1444,1358],{},[589,1446,1447,1454,1455,1457,1458,1461,1462,1465,1466,1469],{},[592,1448,1449,1450,1453],{},"A schedule's day of week ",[573,1451,1452],{},"7"," is Sunday, as in cron."," 1.4 accepted ",[573,1456,1452],{}," and\nnever fired it. Ranges (",[573,1459,1460],{},"1-5",") and steps (",[573,1463,1464],{},"*\u002F15",") work since 2.0. Do: a\n",[573,1467,1468],{},"0 9 * * 7"," trigger that never ran in 1.4 fires every Sunday after the upgrade,\nso change or remove it first if that is not what you want.",[589,1471,1472,1478,1479,1482,1483,1486,1487,1489,1490,1493,1494,1498],{},[592,1473,1110,1474,1477],{},[573,1475,1476],{},"steering\u002F"," directory is no longer read."," 0.x read a directory of ",[573,1480,1481],{},".md","\nfiles, and 1.x folded it into ",[573,1484,1485],{},"library.yaml"," at the first start. Every 1.x\nstart already folded it, so a directory left over is only files. Do: on a 0.x\nhome updated straight to 2.0, copy those files' text into ",[573,1488,1485],{},"'s\n",[573,1491,1492],{},"steering:"," by hand, because 2.0 loses them as steering\n(",[561,1495,1497],{"href":1496},"\u002Fguides\u002Frun\u002Fupgrade-from-0-x-or-a-release-candidate#migrating-a-home-from-0x","Upgrade from 0.x","\nhas the update).",[589,1500,1501,1512,1513,1516,1517,1520,1521,1524],{},[592,1502,1503,607,1506,1508,1509],{},[561,1504,443],{"href":1505},"\u002Fconcepts\u002Fvocabulary#agent-profile",[573,1507,349],{}," are written as ",[573,1510,1511],{},"providers:"," (per\nprovider, ",[573,1514,1515],{},"{model, effort}","), the shape Settings › Harnesses edits. The older\n",[573,1518,1519],{},"model:"," map with one ",[573,1522,1523],{},"effort"," still loads. No action.",[557,1526,1527,1530,1531,607,1534,1536,1537,1539,1540,1397,1542,1545],{},[592,1528,1529],{},"Three keys moved."," Every old place is still read, so a hand-written file\nstops nothing, except ",[573,1532,1533],{},"max_concurrent",[573,1535,357],{},": the server ignores it,\nwith a warning, until the next start moves it to ",[573,1538,341],{},". ",[573,1541,615],{},[573,1543,1544],{},"moved keys"," row names each old place you still have.",[1177,1547,1548,1558],{},[1180,1549,1550],{},[1183,1551,1552,1554,1556],{},[1186,1553,1188],{},[1186,1555,1191],{},[1186,1557,1194],{},[1196,1559,1560,1580,1601,1615],{},[1183,1561,1562,1569,1577],{},[1201,1563,1564,607,1567],{},[573,1565,1566],{},"triggers:",[573,1568,341],{},[1201,1570,1571,607,1574,1576],{},[573,1572,1573],{},"schedules:",[573,1575,357],{},", edited on Settings › Auto-intake",[1201,1578,1579],{},"Nothing: the first start moves it.",[1183,1581,1582,1588,1595],{},[1201,1583,1584,607,1586],{},[573,1585,1533],{},[573,1587,357],{},[1201,1589,1590,607,1592,1594],{},[573,1591,1533],{},[573,1593,341],{},", on Settings › Policy › Housekeeping",[1201,1596,1597,1598,1600],{},"Nothing: the first start moves it, unless ",[573,1599,341],{}," already sets one.",[1183,1602,1603,1608,1612],{},[1201,1604,1605,1607],{},[573,1606,1286],{}," in a repo entry",[1201,1609,1610],{},[573,1611,1297],{},[1201,1613,1614],{},"Nothing: the old key is still read.",[1183,1616,1617,1624,1629],{},[1201,1618,1619,607,1622],{},[573,1620,1621],{},"board.group_by: template",[573,1623,365],{},[1201,1625,1626],{},[573,1627,1628],{},"board.group_by: chain",[1201,1630,1631,1632,610],{},"Nothing: the old value reads as ",[573,1633,1170],{},[557,1635,1636],{},"Unless the notes below apply, there is nothing to do:",[586,1638,1639,1660,1667,1676,1682,1694],{},[589,1640,1641,1642,1397,1644,1646,1647,607,1649,1651,1652,749,1654,1656,1657,1659],{},"The first start carries the first two, in the renamed home or in one you point\nat by hand: ",[573,1643,341],{},[573,1645,1566],{}," become ",[573,1648,1573],{},[573,1650,357],{},",\nand an ",[573,1653,357],{},[573,1655,1533],{}," moves to ",[573,1658,341],{}," unless it\nalready sets one.",[589,1661,1662,1663,1666],{},"Each file a key moves between is rewritten, readable by you alone (",[573,1664,1665],{},"0600",");\nthe rest of it keeps its comments and layout.",[589,1668,1669,1670,1672,1673,1675],{},"A moved trigger takes its comments with it: the lines above it and the ones\non its own lines. A comment line above ",[573,1671,1566],{}," itself stays in\n",[573,1674,341],{},", even once every trigger has moved, when it sits over the next\nkey: delete it by hand.",[589,1677,1678,1679,1681],{},"A comment on the ",[573,1680,1533],{}," line is dropped. If keeping a file's\ncomments would leave it unreadable, the start writes it without them, and its\nlog says so.",[589,1683,1684,1685,1687,1688,1690,1691,1693],{},"A trigger 2.0's schedule refuses (1.4 ignored an extra key such as\n",[573,1686,776],{},") stays in ",[573,1689,341],{},", still read and fired, and the rest\nmove. Doctor's ",[573,1692,1544],{}," row names the key that keeps each one there (the\nstart's log names only the first).",[589,1695,1696,1697,1700,1701,636,1704,1707,1708,1711,1712,1715,1716,1718],{},"A trigger whose ",[573,1698,1699],{},"cron"," names a value outside its field (",[573,1702,1703],{},"0 24 * * *",[573,1705,1706],{},"0 9 * * 8","), which 1.4 loaded and never ran, or a number in digits other\nthan 0-9 (",[573,1709,1710],{},"²",", which 1.4 never ran, or ",[573,1713,1714],{},"٣",", which it ran as 3), stays in\n",[573,1717,341],{}," too and is skipped, with a warning, rather than refusing the\nfile.",[557,1720,1721,1727,1728,1489,1730,1733,1734,1737,1738,864,1741,610],{},[592,1722,1723,1724,1726],{},"Four ",[573,1725,323],{}," keys an older Kraft wrote are not read."," A repo still\ncarrying one loads, the server log names it once, and ",[573,1729,615],{},[573,1731,1732],{},"keys"," row warns, naming what replaced it. ",[573,1735,1736],{},"gitlab_project"," is still read as\n",[573,1739,1740],{},"forge: gitlab",[573,1742,1743],{},"project:",[1177,1745,1746,1756],{},[1180,1747,1748],{},[1183,1749,1750,1752,1754],{},[1186,1751,1188],{},[1186,1753,1191],{},[1186,1755,1194],{},[1196,1757,1758,1779,1791,1809],{},[1183,1759,1760,1765,1776],{},[1201,1761,1762],{},[573,1763,1764],{},"default_model",[1201,1766,1767,1768,1772,1773],{},"A model per ",[561,1769,1771],{"href":1770},"\u002Fconcepts\u002Fvocabulary#harness-profile","harness profile"," under ",[573,1774,1775],{},"models:",[1201,1777,1778],{},"Replace the key.",[1183,1780,1781,1786,1789],{},[1201,1782,1783],{},[573,1784,1785],{},"submodules",[1201,1787,1788],{},"Each submodule as an entry of its own",[1201,1790,1778],{},[1183,1792,1793,1798,1807],{},[1201,1794,1795],{},[573,1796,1797],{},"default_root_merge_policy",[1201,1799,1110,1800,1397,1804],{},[561,1801,1803],{"href":1802},"\u002Fconcepts\u002Fvocabulary#workspace","workspace",[573,1805,1806],{},"root_pointer_default",[1201,1808,1778],{},[1183,1810,1811,1816,1819],{},[1201,1812,1813],{},[573,1814,1815],{},"allow_cross_repo",[1201,1817,1818],{},"Nothing",[1201,1820,1821],{},"Remove it.",[581,1823,1825],{"id":1824},"permission-hooks","Permission hooks",[586,1827,1828],{},[589,1829,1830,1836,1837,1840,1841,1843,1844,1846,1847,610],{},[592,1831,1832,1833,610],{},"Cursor's hook entry runs Kraft's Python with ",[573,1834,1835],{},"-I"," 1.4 wrote the entry in a\nworktree's ",[573,1838,1839],{},".cursor\u002Fhooks.json"," without ",[573,1842,1835],{},". The server adds ",[573,1845,1835],{}," to each\nexisting worktree's entry when it starts, so a worktree that already exists\ngets it too. No action. See ",[561,1848,459],{"href":1849},"\u002Freference\u002Fpermissions#cursor",[581,1851,1853],{"id":1852},"the-interface","The interface",[586,1855,1856,1867,1881,1889],{},[589,1857,1858,1861,1862,1866],{},[592,1859,1860],{},"2.0 replaces the interface, and some pages moved."," Old addresses still open\nthe right page. No action: see ",[561,1863,1865],{"href":1864},"#where-the-pages-moved","Where the pages moved","\nfor where each one went.",[589,1868,1869,1872,1873,1875,1876,1880],{},[592,1870,1871],{},"The theme file changes once."," The first start rewrites ",[573,1874,365],{}," so the\nlook you had stays. No action: see ",[561,1877,1879],{"href":1878},"#your-theme","Your theme"," if it looks wrong.",[589,1882,1883,1886,1887,610],{},[592,1884,1885],{},"The phone layout"," shows on a screen narrower than 768 pixels, with the same\npages behind a bottom bar. No action: see\n",[561,1888,93],{"href":94},[589,1890,1891,1894,1895,610],{},[592,1892,1893],{},"The 2.0 VS Code extension needs Kraft 2.0 or a later 2.x."," VS Code updates\nthe extension on its own. Against a 1.4 server it shows the board but disables\nevery action, and a 1.4 extension is read-only against a 2.0 server. Do: update\nKraft and the extension together; the messages are in\n",[561,1896,1898],{"href":1897},"\u002Freference\u002Fvscode-extension#if-the-extension-is-read-only","VS Code",[581,1900,1865],{"id":1901},"where-the-pages-moved",[557,1903,1904],{},"Kraft 2.0 replaced the interface. The old pages moved, and the old addresses\nstill open the right page.",[1177,1906,1907,1915],{},[1180,1908,1909],{},[1183,1910,1911,1913],{},[1186,1912,1188],{},[1186,1914,1191],{},[1196,1916,1917,1929,1946,1965,1977,1990,2003,2014],{},[1183,1918,1919,1922],{},[1201,1920,1921],{},"Settings › Chains, and the old Templates page",[1201,1923,1924,1925,1928],{},"Templates › Chains (",[573,1926,1927],{},"\u002Ftemplates\u002Fchains",")",[1183,1930,1931,1934],{},[1201,1932,1933],{},"Settings › Library and Steering",[1201,1935,1936,1937,1940,1941,1945],{},"Templates › Library (",[573,1938,1939],{},"\u002Ftemplates\u002Flibrary","); ",[561,1942,1944],{"href":1943},"\u002Fconcepts\u002Fvocabulary#steering-profile","steering profiles"," are library components",[1183,1947,1948,1951],{},[1201,1949,1950],{},"Settings › Repos and Settings › Harnesses",[1201,1952,1953,1954,802,1957,1960,1961,1964],{},"Still under Settings (",[573,1955,1956],{},"\u002Fsettings\u002Frepos",[573,1958,1959],{},"\u002Fsettings\u002Fharnesses","); the ",[573,1962,1963],{},"\u002Ftemplates\u002F..."," addresses the 2.0 release candidates gave them open the same pages",[1183,1966,1967,1974],{},[1201,1968,1969,1970,1973],{},"Settings › Plugins (",[573,1971,1972],{},"\u002Fsettings\u002Fplugins",", a redirect to Settings › Chains already in 1.4)",[1201,1975,1976],{},"Templates › Chains",[1183,1978,1979,1985],{},[1201,1980,1981,1982,1928],{},"Settings › Notifications (",[573,1983,1984],{},"\u002Fsettings\u002Fnotify",[1201,1986,1981,1987,1928],{},[573,1988,1989],{},"\u002Fsettings\u002Fnotifications",[1183,1991,1992,1998],{},[1201,1993,1994,1995,1928],{},"Settings › Auto-intake (",[573,1996,1997],{},"\u002Fsettings\u002Fintake",[1201,1999,1994,2000,1928],{},[573,2001,2002],{},"\u002Fsettings\u002Fauto-intake",[1183,2004,2005,2008],{},[1201,2006,2007],{},"Settings (the front page)",[1201,2009,2010,2011,1928],{},"Settings › Policy (",[573,2012,2013],{},"\u002Fsettings\u002Fpolicy",[1183,2015,2016,2022],{},[1201,2017,2018,2019,1928],{},"The Search page (",[573,2020,2021],{},"\u002Fsearch",[1201,2023,2024,2025,2028,2029,2032],{},"The board, with the search box on ",[592,2026,2027],{},"⌘K"," (",[592,2030,2031],{},"Ctrl+K",") from any page",[557,2034,2035,2036,2039,2040,610],{},"Repos, Harnesses, Policy, Access and Appearance stayed under Settings. About is\nstill at ",[573,2037,2038],{},"\u002Fsettings\u002Fabout",": on the desktop it opens from the version line at the\nfoot of the sidebar, and on a phone from ",[592,2041,2042],{},"More",[557,2044,2045],{},"A bookmark to an old address opens the page that replaced it, and keeps its\nquery string. Two older kinds of address:",[586,2047,2048,2055],{},[589,2049,2050,2051,2054],{},"An address from the preview of the new interface, which began with ",[573,2052,2053],{},"\u002Fng",",\ndrops that prefix and opens the same page.",[589,2056,2057,2058,2061,2062,2065],{},"A bookmark to an item's old tab address (",[573,2059,2060],{},"\u002Fwork-items\u002FID#tab=changes",") opens\nthe item's review page, and one to a node (",[573,2063,2064],{},"#node=NAME",") opens that node.",[557,2067,2068,2069,2072,2073,2076,2077,610],{},"The ",[592,2070,2071],{},"Current UI"," link and the ",[592,2074,2075],{},"Try the new UI"," banner are gone: there is one\ninterface. On a phone, a screen with no desktop page of its own opens the\nnearest one: see ",[561,2078,93],{"href":94},[581,2080,1879],{"id":2081},"your-theme",[557,2083,2084,2085,802,2088,864,2091,2094,2095,2098,2099,2101,2102,2104,2105,2108,2109,2112,2113,2116],{},"The 2.0 interface chooses color with ",[573,2086,2087],{},"surface",[573,2089,2090],{},"accent",[573,2092,2093],{},"colour_amount",",\nnot ",[573,2096,2097],{},"palette",". The first start after the upgrade rewrites ",[573,2100,365],{}," once, so\nthe look you had stays: your old ",[573,2103,2097],{}," is replaced by the three keys that\ndraw it, and the original file is kept as ",[573,2106,2107],{},"theme.yaml.pre-2.0"," beside it. A home\na 1.5.0 release candidate already converted keeps that candidate's copy as its\none copy, and gets no second one: ",[573,2110,2111],{},"theme.yaml.pre-1.5",", or ",[573,2114,2115],{},"theme.yaml.pre-ux2","\nfrom 1.5.0rc5 to rc9.",[557,2118,2119,2120,864,2122,2124,2125,2127,2128,2130,2131,610],{},"Which ",[573,2121,2087],{},[573,2123,2090],{}," each old ",[573,2126,2097],{}," becomes, and what happens to a\n",[573,2129,2097],{}," that reappears, is in\n",[561,2132,2134,2136],{"href":2133},"\u002Freference\u002Fconfiguration\u002Ftheme#palette-is-legacy",[573,2135,2097],{}," is legacy",[557,2138,2139],{},"If it still looks wrong:",[586,2141,2142,2149,2162,2173],{},[589,2143,2144,2145,2148],{},"Open ",[592,2146,2147],{},"Settings › Appearance"," and pick the surface, accent and amount of\ncolor you want. That is the supported way to change them.",[589,2150,2151,2152,2155,2156,2158,2159,2161],{},"To go back to the file as it was before the upgrade, stop Kraft, copy\n",[573,2153,2154],{},"~\u002F.kraft\u002Fconfig\u002Ftheme.yaml.pre-2.0"," (or the candidate's copy named above) over\n",[573,2157,365],{},", and start it again. The next start converts its ",[573,2160,2097],{}," once\nmore. The saved copy is never overwritten.",[589,2163,1110,2164,2166,2167,2169,2170,2172],{},[573,2165,365],{}," that does not parse, or names a value Kraft does not know, is\nleft as it was and the interface falls back to its defaults. ",[573,2168,615],{}," has no row for this file: fix the key by hand\n(",[561,2171,365],{"href":366}," lists them), or delete the\nfile to start from the defaults.",[589,2174,2175,2178],{},[573,2176,2177],{},"mode: system"," follows your operating system's light or dark setting.",[581,2180,2182],{"id":2181},"related","Related",[586,2184,2185,2190,2195],{},[589,2186,2187,2189],{},[561,2188,187],{"href":188},": the steps to update without losing the database.",[589,2191,2192,2194],{},[561,2193,195],{"href":196},": go back if the upgrade went wrong.",[589,2196,2197,2199],{},[561,2198,532],{"href":533},": what you get for these changes.",{"title":2201,"searchDepth":2202,"depth":2202,"links":2203},"",2,[2204,2205,2206,2207,2208,2209,2210,2211,2212],{"id":583,"depth":2202,"text":584},{"id":686,"depth":2202,"text":687},{"id":826,"depth":2202,"text":827},{"id":1333,"depth":2202,"text":1334},{"id":1824,"depth":2202,"text":1825},{"id":1852,"depth":2202,"text":1853},{"id":1901,"depth":2202,"text":1865},{"id":2081,"depth":2202,"text":1879},{"id":2181,"depth":2202,"text":2182},"What 2.0 changes from 1.4, what 1.4 did, and what to do about each change, plus where the pages moved and what became of your theme.","md",null,{},true,{"title":513,"description":2213},"aHlM8wqsUstRR_vcsArIIUastHK9Rk_DVppDq-WRIK8",[2221,2223],{"title":509,"path":510,"stem":511,"description":2222,"children":-1},"The Kraft extension's status bar, the items its board shows, its settings, Restricted Mode, and the versions it works with.",{"title":10,"path":518,"stem":522,"description":2224,"children":-1},"Security, data and privacy, release news, status and support, architecture, and how to contribute.",1792362343018]