[{"data":1,"prerenderedAt":2596},["ShallowReactive",2],{"navigation_docs":3,"-guides-run-upgrade-from-1-4":504,"-guides-run-upgrade-from-1-4-surround":2591},[4,28,51,187,214,469],{"title":5,"path":6,"stem":7,"children":8},"Get started","\u002Fget-started","1.get-started",[9,12,16,20,24],{"title":10,"path":6,"stem":11},"Overview","1.get-started\u002Findex",{"title":13,"path":14,"stem":15},"Why Kraft","\u002Fget-started\u002Fwhy-kraft","1.get-started\u002F0.why-kraft",{"title":17,"path":18,"stem":19},"Install","\u002Fget-started\u002Finstall","1.get-started\u002F1.install",{"title":21,"path":22,"stem":23},"Your first work item","\u002Fget-started\u002Ffirst-work-item","1.get-started\u002F2.first-work-item",{"title":25,"path":26,"stem":27},"FAQ","\u002Fget-started\u002Ffaq","1.get-started\u002F3.faq",{"title":29,"path":30,"stem":31,"children":32},"Concepts","\u002Fconcepts","2.concepts",[33,35,39,43,47],{"title":10,"path":30,"stem":34},"2.concepts\u002Findex",{"title":36,"path":37,"stem":38},"How a work item runs","\u002Fconcepts\u002Fhow-a-work-item-runs","2.concepts\u002F1.how-a-work-item-runs",{"title":40,"path":41,"stem":42},"Caps and budgets","\u002Fconcepts\u002Fcaps-and-budgets","2.concepts\u002F2.caps-and-budgets",{"title":44,"path":45,"stem":46},"Why a permission gate","\u002Fconcepts\u002Fpermission-gate","2.concepts\u002F3.permission-gate",{"title":48,"path":49,"stem":50},"Vocabulary","\u002Fconcepts\u002Fvocabulary","2.concepts\u002F4.vocabulary",{"title":52,"path":53,"stem":54,"children":55},"Guides","\u002Fguides","3.guides",[56,58,96,113,134,183],{"title":10,"path":53,"stem":57},"3.guides\u002Findex",{"title":59,"path":60,"stem":61,"children":62,"page":95},"Day to day","\u002Fguides\u002Fday-to-day","3.guides\u002F1.day-to-day",[63,67,71,75,79,83,87,91],{"title":64,"path":65,"stem":66},"The setup wizard on first start","\u002Fguides\u002Fday-to-day\u002Ffirst-run","3.guides\u002F1.day-to-day\u002F2.first-run",{"title":68,"path":69,"stem":70},"File a work item","\u002Fguides\u002Fday-to-day\u002Ffile-a-work-item","3.guides\u002F1.day-to-day\u002F3.file-a-work-item",{"title":72,"path":73,"stem":74},"Use Kraft from your agent","\u002Fguides\u002Fday-to-day\u002Fagent-integration","3.guides\u002F1.day-to-day\u002F4.agent-integration",{"title":76,"path":77,"stem":78},"Reviewing a change","\u002Fguides\u002Fday-to-day\u002Freview-a-change","3.guides\u002F1.day-to-day\u002F5.review-a-change",{"title":80,"path":81,"stem":82},"Raise a cap on a stopped item","\u002Fguides\u002Fday-to-day\u002Fraise-a-cap","3.guides\u002F1.day-to-day\u002F6.raise-a-cap",{"title":84,"path":85,"stem":86},"Kraft for VS Code","\u002Fguides\u002Fday-to-day\u002Fvscode","3.guides\u002F1.day-to-day\u002F7.vscode",{"title":88,"path":89,"stem":90},"Kraft on a phone","\u002Fguides\u002Fday-to-day\u002Fkraft-on-a-phone","3.guides\u002F1.day-to-day\u002F8.kraft-on-a-phone",{"title":92,"path":93,"stem":94},"Get notified when an item needs you","\u002Fguides\u002Fday-to-day\u002Fnotifications","3.guides\u002F1.day-to-day\u002F9.notifications",false,{"title":97,"path":98,"stem":99,"children":100,"page":95},"Customize and automate","\u002Fguides\u002Fcustomize","3.guides\u002F2.customize",[101,105,109],{"title":102,"path":103,"stem":104},"Write your own chain","\u002Fguides\u002Fcustomize\u002Fwrite-your-own-chain","3.guides\u002F2.customize\u002F1.write-your-own-chain",{"title":106,"path":107,"stem":108},"Add a security review or a gate reviewer","\u002Fguides\u002Fcustomize\u002Fadd-review-agents","3.guides\u002F2.customize\u002F2.add-review-agents",{"title":110,"path":111,"stem":112},"Schedule or webhook work","\u002Fguides\u002Fcustomize\u002Fschedule-and-webhook-work","3.guides\u002F2.customize\u002F3.schedule-and-webhook-work",{"title":114,"path":115,"stem":116,"children":117,"page":95},"Agents and harnesses","\u002Fguides\u002Fharnesses","3.guides\u002F3.harnesses",[118,122,126,130],{"title":119,"path":120,"stem":121},"Switch a task to another harness","\u002Fguides\u002Fharnesses\u002Fswitch-harness","3.guides\u002F3.harnesses\u002F1.switch-harness",{"title":123,"path":124,"stem":125},"Add or override a harness","\u002Fguides\u002Fharnesses\u002Fadding-a-harness","3.guides\u002F3.harnesses\u002F2.adding-a-harness",{"title":127,"path":128,"stem":129},"Build a worker Kit","\u002Fguides\u002Fharnesses\u002Fworker-kit","3.guides\u002F3.harnesses\u002F3.worker-kit",{"title":131,"path":132,"stem":133},"Give a worker its login","\u002Fguides\u002Fharnesses\u002Fgive-a-worker-its-login","3.guides\u002F3.harnesses\u002F4.give-a-worker-its-login",{"title":135,"path":136,"stem":137,"children":138,"page":95},"Run the server","\u002Fguides\u002Frun","3.guides\u002F4.run",[139,143,147,151,155,159,163,167,171,175,179],{"title":140,"path":141,"stem":142},"Remote access","\u002Fguides\u002Frun\u002Fremote-access","3.guides\u002F4.run\u002F01.remote-access",{"title":144,"path":145,"stem":146},"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":148,"path":149,"stem":150},"Restart Kraft without ending running agents","\u002Fguides\u002Frun\u002Frestart-kraft","3.guides\u002F4.run\u002F03.restart-kraft",{"title":152,"path":153,"stem":154},"Back up and restore the database","\u002Fguides\u002Frun\u002Fback-up-and-restore","3.guides\u002F4.run\u002F04.back-up-and-restore",{"title":156,"path":157,"stem":158},"Logs and disk space","\u002Fguides\u002Frun\u002Flogs-and-disk-space","3.guides\u002F4.run\u002F05.logs-and-disk-space",{"title":160,"path":161,"stem":162},"Run Kraft as a service","\u002Fguides\u002Frun\u002Frun-as-a-service","3.guides\u002F4.run\u002F06.run-as-a-service",{"title":164,"path":165,"stem":166},"Upgrade Kraft","\u002Fguides\u002Frun\u002Fupgrade-kraft","3.guides\u002F4.run\u002F07.upgrade-kraft",{"title":168,"path":169,"stem":170},"Upgrade your configuration","\u002Fguides\u002Frun\u002Fupgrade-your-configuration","3.guides\u002F4.run\u002F08.upgrade-your-configuration",{"title":172,"path":173,"stem":174},"Upgrade from 1.4","\u002Fguides\u002Frun\u002Fupgrade-from-1-4","3.guides\u002F4.run\u002F09.upgrade-from-1-4",{"title":176,"path":177,"stem":178},"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":180,"path":181,"stem":182},"Roll back to 1.4","\u002Fguides\u002Frun\u002Froll-back","3.guides\u002F4.run\u002F11.roll-back",{"title":184,"path":185,"stem":186},"Kraft Lite","\u002Fguides\u002Fkraft-lite","3.guides\u002F5.kraft-lite",{"title":188,"path":189,"stem":190,"children":191},"Troubleshooting","\u002Ftroubleshooting","4.troubleshooting",[192,194,198,202,206,210],{"title":10,"path":189,"stem":193},"4.troubleshooting\u002Findex",{"title":195,"path":196,"stem":197},"Why did my item stop?","\u002Ftroubleshooting\u002Fwhy-did-my-item-stop","4.troubleshooting\u002F1.why-did-my-item-stop",{"title":199,"path":200,"stem":201},"Stop reasons in detail","\u002Ftroubleshooting\u002Fstop-reasons-in-detail","4.troubleshooting\u002F2.stop-reasons-in-detail",{"title":203,"path":204,"stem":205},"Starting and reaching Kraft","\u002Ftroubleshooting\u002Fstarting-and-reaching-kraft","4.troubleshooting\u002F3.starting-and-reaching-kraft",{"title":207,"path":208,"stem":209},"Doctor failures","\u002Ftroubleshooting\u002Fdoctor-failures","4.troubleshooting\u002F4.doctor-failures",{"title":211,"path":212,"stem":213},"Sandbox and Kit stops","\u002Ftroubleshooting\u002Fsandbox-and-kit-stops","4.troubleshooting\u002F5.sandbox-and-kit-stops",{"title":215,"path":216,"stem":217,"children":218},"Reference","\u002Freference","5.reference",[219,221,259,281,285,375,393,419,423,427,461,465],{"title":10,"path":216,"stem":220},"5.reference\u002Findex",{"title":222,"path":223,"stem":224,"children":225},"Web UI","\u002Freference\u002Fweb-ui","5.reference\u002F00.web-ui\u002Findex",[226,227,231,235,239,243,247,251,255],{"title":10,"path":223,"stem":224},{"title":228,"path":229,"stem":230},"Sidebar, search, and keyboard","\u002Freference\u002Fweb-ui\u002Fsidebar-search-and-keyboard","5.reference\u002F00.web-ui\u002F0.sidebar-search-and-keyboard",{"title":232,"path":233,"stem":234},"The board","\u002Freference\u002Fweb-ui\u002Fboard","5.reference\u002F00.web-ui\u002F1.board",{"title":236,"path":237,"stem":238},"An item's page","\u002Freference\u002Fweb-ui\u002Fitem-page","5.reference\u002F00.web-ui\u002F2.item-page",{"title":240,"path":241,"stem":242},"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":244,"path":245,"stem":246},"Config before an item starts","\u002Freference\u002Fweb-ui\u002Fconfig-before-start","5.reference\u002F00.web-ui\u002F4.config-before-start",{"title":248,"path":249,"stem":250},"The review page","\u002Freference\u002Fweb-ui\u002Freview-page","5.reference\u002F00.web-ui\u002F5.review-page",{"title":252,"path":253,"stem":254},"Templates and Settings","\u002Freference\u002Fweb-ui\u002Ftemplates-and-settings","5.reference\u002F00.web-ui\u002F6.templates-and-settings",{"title":256,"path":257,"stem":258},"Analytics","\u002Freference\u002Fweb-ui\u002Fanalytics","5.reference\u002F00.web-ui\u002F7.analytics",{"title":260,"path":261,"stem":262,"children":263},"CLI","\u002Freference\u002Fcli","5.reference\u002F01.cli\u002Findex",[264,265,269,273,277],{"title":10,"path":261,"stem":262},{"title":266,"path":267,"stem":268},"Item verbs","\u002Freference\u002Fcli\u002Fitem","5.reference\u002F01.cli\u002F2.item",{"title":270,"path":271,"stem":272},"View verbs","\u002Freference\u002Fcli\u002Fview","5.reference\u002F01.cli\u002F3.view",{"title":274,"path":275,"stem":276},"Repo verbs","\u002Freference\u002Fcli\u002Frepo","5.reference\u002F01.cli\u002F4.repo",{"title":278,"path":279,"stem":280},"Admin verbs","\u002Freference\u002Fcli\u002Fadmin","5.reference\u002F01.cli\u002F5.admin",{"title":282,"path":283,"stem":284},"Work item statuses","\u002Freference\u002Fstatuses","5.reference\u002F02.statuses",{"title":286,"path":287,"stem":288,"children":289},"Configuration","\u002Freference\u002Fconfiguration","5.reference\u002F03.configuration\u002Findex",[290,291,309,313,317,321,325,329,333,337,371],{"title":10,"path":287,"stem":288},{"title":292,"path":293,"stem":294,"children":295},"repos.yaml","\u002Freference\u002Fconfiguration\u002Frepos","5.reference\u002F03.configuration\u002F02.repos\u002Findex",[296,297,301,305],{"title":10,"path":293,"stem":294},{"title":298,"path":299,"stem":300},"How connect proposes commands","\u002Freference\u002Fconfiguration\u002Frepos\u002Fconnect-proposals","5.reference\u002F03.configuration\u002F02.repos\u002F1.connect-proposals",{"title":302,"path":303,"stem":304},"detectors.yaml","\u002Freference\u002Fconfiguration\u002Frepos\u002Fdetectors","5.reference\u002F03.configuration\u002F02.repos\u002F2.detectors",{"title":306,"path":307,"stem":308},"Workspaces","\u002Freference\u002Fconfiguration\u002Frepos\u002Fworkspaces","5.reference\u002F03.configuration\u002F02.repos\u002F3.workspaces",{"title":310,"path":311,"stem":312},"policy.yaml","\u002Freference\u002Fconfiguration\u002Fpolicy","5.reference\u002F03.configuration\u002F03.policy",{"title":314,"path":315,"stem":316},"Library and chains","\u002Freference\u002Fconfiguration\u002Flibrary-and-chains","5.reference\u002F03.configuration\u002F04.library-and-chains",{"title":318,"path":319,"stem":320},"harnesses.yaml","\u002Freference\u002Fconfiguration\u002Fharnesses-file","5.reference\u002F03.configuration\u002F05.harnesses-file",{"title":322,"path":323,"stem":324},"access.yaml","\u002Freference\u002Fconfiguration\u002Faccess","5.reference\u002F03.configuration\u002F06.access",{"title":326,"path":327,"stem":328},"intake.yaml","\u002Freference\u002Fconfiguration\u002Fintake","5.reference\u002F03.configuration\u002F07.intake",{"title":330,"path":331,"stem":332},"notify.yaml","\u002Freference\u002Fconfiguration\u002Fnotify","5.reference\u002F03.configuration\u002F08.notify",{"title":334,"path":335,"stem":336},"theme.yaml","\u002Freference\u002Fconfiguration\u002Ftheme","5.reference\u002F03.configuration\u002F09.theme",{"title":338,"path":339,"stem":340,"children":341},"Sandboxed workers","\u002Freference\u002Fconfiguration\u002Fsandbox","5.reference\u002F03.configuration\u002F10.sandbox\u002Findex",[342,343,347,351,355,359,363,367],{"title":10,"path":339,"stem":340},{"title":344,"path":345,"stem":346},"Resource limits","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fresource-limits","5.reference\u002F03.configuration\u002F10.sandbox\u002F1.resource-limits",{"title":348,"path":349,"stem":350},"Callbacks from a sandbox","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fcallbacks","5.reference\u002F03.configuration\u002F10.sandbox\u002F2.callbacks",{"title":352,"path":353,"stem":354},"Network policy","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fnetwork-policy","5.reference\u002F03.configuration\u002F10.sandbox\u002F3.network-policy",{"title":356,"path":357,"stem":358},"Credentials","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fcredentials","5.reference\u002F03.configuration\u002F10.sandbox\u002F4.credentials",{"title":360,"path":361,"stem":362},"Kits","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fkits","5.reference\u002F03.configuration\u002F10.sandbox\u002F5.kits",{"title":364,"path":365,"stem":366},"sandbox.yaml","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fsandbox-yaml","5.reference\u002F03.configuration\u002F10.sandbox\u002F6.sandbox-yaml",{"title":368,"path":369,"stem":370},"Git in a sandbox","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fgit-in-a-sandbox","5.reference\u002F03.configuration\u002F10.sandbox\u002F7.git-in-a-sandbox",{"title":372,"path":373,"stem":374},"Environment variables","\u002Freference\u002Fconfiguration\u002Fenvironment-variables","5.reference\u002F03.configuration\u002F11.environment-variables",{"title":376,"path":377,"stem":378,"children":379},"Chain file keys","\u002Freference\u002Fchain-nodes","5.reference\u002F04.chain-nodes\u002Findex",[380,381,385,389],{"title":10,"path":377,"stem":378},{"title":382,"path":383,"stem":384},"Subprocess tasks","\u002Freference\u002Fchain-nodes\u002Fsubprocess-tasks","5.reference\u002F04.chain-nodes\u002F2.subprocess-tasks",{"title":386,"path":387,"stem":388},"Fix loop and judge","\u002Freference\u002Fchain-nodes\u002Ffix-loop","5.reference\u002F04.chain-nodes\u002F3.fix-loop",{"title":390,"path":391,"stem":392},"Result file","\u002Freference\u002Fchain-nodes\u002Fresult-file","5.reference\u002F04.chain-nodes\u002F4.result-file",{"title":394,"path":395,"stem":396,"children":397},"Agent harnesses","\u002Freference\u002Fharnesses","5.reference\u002F05.harnesses\u002Findex",[398,399,403,407,411,415],{"title":10,"path":395,"stem":396},{"title":400,"path":401,"stem":402},"Unattended runs","\u002Freference\u002Fharnesses\u002Funattended-runs","5.reference\u002F05.harnesses\u002F2.unattended-runs",{"title":404,"path":405,"stem":406},"Agent profiles","\u002Freference\u002Fharnesses\u002Fagent-profiles","5.reference\u002F05.harnesses\u002F3.agent-profiles",{"title":408,"path":409,"stem":410},"Harness definition files","\u002Freference\u002Fharnesses\u002Fharness-files","5.reference\u002F05.harnesses\u002F4.harness-files",{"title":412,"path":413,"stem":414},"Fallback and escalation","\u002Freference\u002Fharnesses\u002Ffallback-and-escalation","5.reference\u002F05.harnesses\u002F5.fallback-and-escalation",{"title":416,"path":417,"stem":418},"Cost reporting","\u002Freference\u002Fharnesses\u002Fcost-reporting","5.reference\u002F05.harnesses\u002F6.cost-reporting",{"title":420,"path":421,"stem":422},"Permission gate","\u002Freference\u002Fpermissions","5.reference\u002F06.permissions",{"title":424,"path":425,"stem":426},"Inbound triggers","\u002Freference\u002Ftriggers","5.reference\u002F07.triggers",{"title":428,"path":429,"stem":430,"children":431},"HTTP API","\u002Freference\u002Fhttp-api","5.reference\u002F08.http-api\u002Findex",[432,433,437,441,445,449,453,457],{"title":10,"path":429,"stem":430},{"title":434,"path":435,"stem":436},"Filing, reading and changing work items","\u002Freference\u002Fhttp-api\u002Fwork-items","5.reference\u002F08.http-api\u002F2.work-items",{"title":438,"path":439,"stem":440},"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":442,"path":443,"stem":444},"The work item object","\u002Freference\u002Fhttp-api\u002Fwork-item-object","5.reference\u002F08.http-api\u002F4.work-item-object",{"title":446,"path":447,"stem":448},"Budget, events, diff and documents","\u002Freference\u002Fhttp-api\u002Fbudget-and-events","5.reference\u002F08.http-api\u002F5.budget-and-events",{"title":450,"path":451,"stem":452},"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":454,"path":455,"stem":456},"Drafts","\u002Freference\u002Fhttp-api\u002Fdrafts","5.reference\u002F08.http-api\u002F7.drafts",{"title":458,"path":459,"stem":460},"Ops for each draft area","\u002Freference\u002Fhttp-api\u002Fdraft-ops","5.reference\u002F08.http-api\u002F8.draft-ops",{"title":462,"path":463,"stem":464},"MCP tools","\u002Freference\u002Fmcp-tools","5.reference\u002F09.mcp-tools",{"title":466,"path":467,"stem":468},"Events","\u002Freference\u002Fevents","5.reference\u002F10.events",{"title":470,"path":471,"stem":472,"children":473},"Security and project","\u002Fproject","6.project",[474,476,480,484,488,492,496,500],{"title":10,"path":471,"stem":475},"6.project\u002Findex",{"title":477,"path":478,"stem":479},"Security","\u002Fproject\u002Fsecurity","6.project\u002F1.security",{"title":481,"path":482,"stem":483},"Data and privacy","\u002Fproject\u002Fdata-and-privacy","6.project\u002F2.data-and-privacy",{"title":485,"path":486,"stem":487},"What's new in 2.0","\u002Fproject\u002Fwhats-new","6.project\u002F3.whats-new",{"title":489,"path":490,"stem":491},"Status and support","\u002Fproject\u002Fstatus-and-support","6.project\u002F4.status-and-support",{"title":493,"path":494,"stem":495},"Architecture","\u002Fproject\u002Farchitecture","6.project\u002F5.architecture",{"title":497,"path":498,"stem":499},"Source map","\u002Fproject\u002Fsource-map","6.project\u002F6.source-map",{"title":501,"path":502,"stem":503},"Contributing","\u002Fproject\u002Fcontributing","6.project\u002F7.contributing",{"id":505,"title":172,"body":506,"description":2584,"extension":2585,"links":2586,"meta":2587,"navigation":2588,"path":173,"seo":2589,"stem":174,"__hash__":2590},"docs\u002F3.guides\u002F4.run\u002F09.upgrade-from-1-4.md",{"type":507,"value":508,"toc":2562},"minimark",[509,525,556,561,606,609,616,830,834,871,874,881,914,917,938,945,948,960,963,967,1058,1061,1190,1194,1527,1540,1695,1698,1885,1905,1993,1996,2078,2102,2180,2184,2208,2212,2257,2260,2263,2390,2400,2403,2423,2436,2439,2474,2494,2497,2536,2540],[510,511,512,513,516,517,521,522,524],"p",{},"You will be on 2.0, coming from 1.4, and you will know which of its changes need something from you. An upgrade between 2.x releases needs only ",[514,515,164],"a",{"href":165},". A release candidate, a 0.x home or an install from before the ",[518,519,520],"code",{},"kraft-sdlc"," rename follows ",[514,523,176],{"href":177},".",[526,527,528,546],"ul",{},[529,530,531,535,536,540,541,545],"li",{},[532,533,534],"strong",{},"On 1.4:"," follow ",[514,537,539],{"href":538},"#update-from-14","Update from 1.4",", then read ",[514,542,544],{"href":543},"#what-changed","What changed"," for the changes that need something from you.",[529,547,548,551,552,524],{},[532,549,550],{},"Already ran 1.4's own update:"," go to ",[514,553,555],{"href":554},"#if-you-used-14s-update-anyway","If you used 1.4's update anyway",[557,558,560],"h2",{"id":559},"before-you-start","Before you start",[526,562,563,570,589,603],{},[529,564,565,566,569],{},"You know how Kraft was installed: with uv or ",[518,567,568],{},"install.sh",", with Homebrew, or with pipx. Step 4 differs for each.",[529,571,572,573,576,577,580,581,584,585,588],{},"On uv or pipx, you know the Python Kraft runs on and whether you use vector search. ",[518,574,575],{},"\"$(uv tool dir)\u002Fkraft-sdlc\u002Fbin\u002Fpython\" -V"," prints the Python. The ",[518,578,579],{},"embeddings"," line of ",[518,582,583],{},"kraft admin health"," says ",[518,586,587],{},"unavailable (the 'vector' extra is not installed"," when you don't have the extra.",[529,590,591,594,595,598,599,602],{},[518,592,593],{},"sqlite3"," or ",[518,596,597],{},"python3"," is on your ",[518,600,601],{},"PATH",", for the backup in step 1.",[529,604,605],{},"You can pick a moment when no agent runs, or you will pause the running items first (step 3).",[557,607,539],{"id":608},"update-from-14",[510,610,611,612,615],{},"Do not update with 1.4's own ",[518,613,614],{},"kraft admin update",". That command runs in the\nrelease you have installed, and 1.4's mishandles a uv install and a pipx\ninstall, as step 4 says. Use your package manager:",[617,618,619,627,694,701,823],"ol",{},[529,620,621,622,626],{},"Back up the database, as step 1 of ",[514,623,625],{"href":624},"\u002Fguides\u002Frun\u002Fupgrade-kraft#upgrade","Upgrade"," says. 1.4 cannot open\nthe database 2.0 migrates. Keep the file name that step prints: a rollback to\n1.4 needs it, and a later upgrade's backup never replaces it.",[529,628,629,630],{},"Do what has to come first. Each item names its change below:\n",[526,631,632,644,653,667,683],{},[529,633,634,635,638,639,643],{},"On a network bind, add each name you use to ",[518,636,637],{},"allowed_hosts","\n(",[514,640,642],{"href":641},"#network-access","Network access",").",[529,645,646,647,650,651,643],{},"Behind a tunnel or reverse proxy on a loopback bind, make it send a\nloopback ",[518,648,649],{},"Host"," (",[514,652,642],{"href":641},[529,654,655,656,659,660,650,663,643],{},"On a repo entry with ",[518,657,658],{},"test_command: \"\"",", set a real test command or\n",[518,661,662],{},"enabled: false",[514,664,666],{"href":665},"#items-and-repos","Items and repos",[529,668,669,670,673,674,677,678,650,681,643],{},"On a repo whose ",[518,671,672],{},"sandbox:"," has no ",[518,675,676],{},"network:",", add one, or set\n",[518,679,680],{},"unrestricted_network: true",[514,682,666],{"href":665},[529,684,685,686,689,690,643],{},"On a schedule with day of week ",[518,687,688],{},"7",", change or remove it unless you want it\nto fire on Sundays (",[514,691,693],{"href":692},"#config-directory-and-files","Config directory and files",[529,695,696,697,524],{},"Pause the running items, or wait until none run. See\n",[514,698,700],{"href":699},"\u002Fguides\u002Frun\u002Frestart-kraft#a-restart-ends-running-agents","A restart ends running agents",[529,702,703,704],{},"Install 2.0 with the tool you installed Kraft with:\n",[526,705,706,765,808],{},[529,707,708,714,715,718,719,722,723,726,727,730,731,737,738,741,742,745,746,749,750,753,754,757,758,760,761,764],{},[532,709,710,711,713],{},"uv or ",[518,712,568],{},":"," run\n",[518,716,717],{},"uv tool install --force --python 3.X \"kraft-sdlc[vector]==\u003Cversion>\"",",\nwith the Python you installed Kraft with for ",[518,720,721],{},"3.X"," and the release for\n",[518,724,725],{},"\u003Cversion>",": the number without the ",[518,728,729],{},"v",", as the newest tag on the\n",[514,732,736],{"href":733,"rel":734},"https:\u002F\u002Fgithub.com\u002FitsOmidKarami\u002Fkraft\u002Freleases\u002Flatest",[735],"nofollow","releases page"," shows\nit (tag ",[518,739,740],{},"v2.0.0"," is ",[518,743,744],{},"2.0.0","). For example,\n",[518,747,748],{},"uv tool install --force --python 3.13 \"kraft-sdlc[vector]==2.0.0\"",". Leave out\n",[518,751,752],{},"[vector]"," if you don't use vector search.",[755,756],"br",{},"1.4's update installs the new release without the ",[518,759,752],{}," extra and on\nuv's default Python, and leaves ",[518,762,763],{},"uv tool upgrade"," pointing at a file it has\ndeleted.",[529,766,767,770,771,774,775,778,779,782,783],{},[532,768,769],{},"Homebrew:"," run ",[518,772,773],{},"brew update",", then ",[518,776,777],{},"brew info kraft",". It shows the version\nthe tap offers, and ",[518,780,781],{},"brew info"," alone does not refresh the tap.",[526,784,785,796],{},[529,786,787,788,791,792,795],{},"If it still shows 1.4, the tap has no 2.0 yet, and ",[518,789,790],{},"brew upgrade kraft","\nchanges nothing: wait, or run ",[518,793,794],{},"brew uninstall kraft"," and install 2.0 with\nuv as above.",[529,797,798,799,801,802,804,805,807],{},"Otherwise run ",[518,800,790],{},". 1.4's ",[518,803,614],{}," runs the same\ncommand, and loses nothing: the formula has no ",[518,806,752],{}," extra.",[529,809,810,714,813,816,817,819,820,822],{},[532,811,812],{},"pipx:",[518,814,815],{},"pipx install --force --python python3.X \"kraft-sdlc[vector]==\u003Cversion>\"",",\nwith ",[518,818,725],{}," as above.\n1.4's ",[518,821,614],{}," doesn't update a pipx install: it puts a second\nKraft beside it with uv.",[529,824,825,826,829],{},"Restart the server with ",[518,827,828],{},"kraft admin restart",". That restart is 2.0's: it\nlists the running items and asks before it ends their agents.",[557,831,833],{"id":832},"check-it-worked","Check it worked",[526,835,836,848],{},[529,837,838,841,842,844,845,847],{},[518,839,840],{},"kraft --version"," and ",[518,843,583],{}," print the release you installed, as step 5 of ",[514,846,625],{"href":624}," shows.",[529,849,850,853,854,857,858,857,861,841,864,867,868,870],{},[518,851,852],{},"kraft admin doctor"," has a ",[518,855,856],{},"keys",", ",[518,859,860],{},"moved keys",[518,862,863],{},"tests",[518,865,866],{},"config"," row. Each names what 2.0 found in your files: ",[514,869,544],{"href":543}," says what to do about it.",[557,872,555],{"id":873},"if-you-used-14s-update-anyway",[510,875,876,877,880],{},"On a uv install, an update run by 1.4 drops the ",[518,878,879],{},"vector"," extra and moves Kraft to\nuv's default Python. Restart right after it, and do not act on the board before:",[617,882,883,889,899],{},[529,884,885,886,888],{},"Run ",[518,887,828],{}," as soon as the update finishes.",[529,890,891,892,894,895,524],{},"Reinstall ",[518,893,752],{}," with the uv command above, if you use vector search.\nWithout it, vector search stops working: see\n",[514,896,898],{"href":897},"\u002Freference\u002Fweb-ui\u002Fsidebar-search-and-keyboard#vector-search","Enable vector search",[529,900,901,902,904,905,907,908,910,911,524],{},"If you reinstalled the extra, run ",[518,903,828],{}," once more, to be\nsafe. The reinstall replaced files under the server you just restarted, as any\nupdate does, and a restarted server reads them fresh. The ",[518,906,579],{}," line of\n",[518,909,583],{}," then says ",[518,912,913],{},"available",[510,915,916],{},"Before the restart you may see:",[526,918,919,922,932],{},[529,920,921],{},"Items under the wrong heading, and a footer that names the new release. 1.4's\nserver keeps running and serves 2.0's interface, which misreads its board.",[529,923,924,925,927,928,931],{},"A banner over the board saying so, from 2.0.0. A 1.5.0rc14 or earlier\ninterface had none. ",[518,926,852],{},"'s ",[518,929,930],{},"restart"," row warns that the\nserver runs a release older than the one installed.",[529,933,934,937],{},[518,935,936],{},"Internal Server Error"," instead of the board, if Kraft ran on a Python other\nthan uv's default. 1.4's update moved Kraft to another Python and deleted the\nfiles the running server serves, though its API still answers.",[510,939,940,941,944],{},"If you ran ",[518,942,943],{},"kraft admin update --restart"," (or restarted a service), 1.4\nrestarted the server without asking, which ended the agents of running items.\nPause them first next time.",[557,946,544],{"id":947},"what-changed",[510,949,950,951,955,956,959],{},"2.0 changes some 1.4 behavior that the\n",[514,952,954],{"href":953},"\u002Fproject\u002Fstatus-and-support#versioning-and-stability","stability policy"," covers,\nsuch as ",[518,957,958],{},"--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.",[510,961,962],{},"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.",[964,965,642],"h3",{"id":966},"network-access",[526,968,969,993],{},[529,970,971,974,975,977,978],{},[532,972,973],{},"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",[518,976,637],{},". Such a browser now gets a page saying the name isn't allowed.\n",[526,979,980,988],{},[529,981,982,983,985,986,524],{},"Do: before you upgrade, add each exact name you use (no wildcards) on\nSettings › Access, or to ",[518,984,637],{}," in ",[518,987,322],{},[529,989,990,992],{},[518,991,852],{}," warns when the bind is off loopback and the list is\nempty.",[529,994,995,1000,1001,1004,1005,1007,1008,1011,1012,594,1014,1017,1018,1021,1022,1025,1026,1028,1029,1033,1034],{},[532,996,997,998,524],{},"A tunnel or reverse proxy in front of a loopback-bound Kraft must send a\nloopback ",[518,999,649],{}," On a server bound to ",[518,1002,1003],{},"127.0.0.1"," (the default), 2.0\nanswers 403 to every request whose ",[518,1006,649],{}," header isn't ",[518,1009,1010],{},"localhost",",\n",[518,1013,1003],{},[518,1015,1016],{},"[::1]",", webhooks to ",[518,1019,1020],{},"POST \u002Fapi\u002Ftriggers"," and\n",[518,1023,1024],{},"GET \u002Fapi\u002Fhealth"," included. 1.4 checked only requests from a browser, and\n",[518,1027,637],{}," doesn't apply on a loopback bind. See\n",[514,1030,1032],{"href":1031},"\u002Freference\u002Fhttp-api#who-may-call","Who may call"," for the rule.\n",[526,1035,1036,1046],{},[529,1037,1038,1039,1041,1042,524],{},"Do, for the board: bind Kraft beyond loopback, with a password, and list the\nname in ",[518,1040,637],{},". That is the one way the board works through\ncloudflared, ngrok, Caddy or nginx. What a proxy you run must pass is in\n",[514,1043,1045],{"href":1044},"\u002Fguides\u002Frun\u002Fremote-access#behind-a-reverse-proxy-you-run","Behind a reverse proxy you run",[529,1047,1048,1049,1051,1052,1054,1055,1057],{},"Do, for webhooks and scripts alone: have the proxy rewrite ",[518,1050,649],{}," to\n",[518,1053,1010],{},". Read\n",[514,1056,144],{"href":145},"\nfirst, because it also changes who has to sign in.",[964,1059,666],{"id":1060},"items-and-repos",[526,1062,1063,1094,1108,1114,1128,1152,1179],{},[529,1064,1065,1071,1072,1074,1075,1080,1081,1083,1084,1086,1087,1089,1090,1093],{},[532,1066,1067,1068,1070],{},"A sandbox with no ",[518,1069,676],{}," 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.",[755,1073],{},"Do: add a ",[514,1076,1077,1079],{"href":353},[518,1078,676],{}," policy","\nto the sandbox, or set ",[518,1082,680],{}," on it to run as 1.4 did,\nknowing that. The two keys together are refused when ",[518,1085,292],{}," loads.\n",[518,1088,852],{}," fails the ",[518,1091,1092],{},"egress"," row of each such repo.",[529,1095,1096,1099,1100,1104,1105,524],{},[532,1097,1098],{},"Cancel keeps the branch."," Cancel in the web interface keeps the item's\nbranch and ",[514,1101,1103],{"href":1102},"\u002Fconcepts\u002Fvocabulary#worktree","worktree",". 1.4 deleted them. Do: to delete them, run\n",[518,1106,1107],{},"kraft item abandon ID --yes",[529,1109,1110,1113],{},[532,1111,1112],{},"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.",[529,1115,1116,1119,1120,1123,1124,1127],{},[532,1117,1118],{},"A repo with open items can't be disconnected."," ",[518,1121,1122],{},"kraft repo disconnect"," (and\n",[518,1125,1126],{},"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.",[529,1129,1130,1135,1136,1139,1140,1142,1143,1145,1146,1148,1149,1151],{},[532,1131,1132,1134],{},[518,1133,658],{}," means the repo has no tests."," Its items pass ",[518,1137,1138],{},"verify","\nwithout running a test. In 1.4 such an entry stopped every item at ",[518,1141,1138],{},".\nDo: before you upgrade, set a real test command on any such entry, or\n",[518,1144,662],{}," to keep it from running. After the upgrade, the ",[518,1147,863],{}," row of\n",[518,1150,852],{}," names each such entry.",[529,1153,1154,1160,1161],{},[532,1155,1156,1159],{},[518,1157,1158],{},"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.",[526,1162,1163,1172],{},[529,1164,1165,1166,857,1169,1171],{},"That can enable a repo saved disabled for want of a test command. In a\nterminal it asks first; with ",[518,1167,1168],{},"-y",[518,1170,958],{}," or no terminal it saves without\nasking.",[529,1173,1174,1175,1178],{},"Do: a script that re-runs connect to check a repo should run\n",[518,1176,1177],{},"kraft repo list"," instead.",[529,1180,1181,1186,1187,1189],{},[532,1182,1183,1185],{},[518,1184,1158],{}," refuses a repo with no commit yet."," 1.4 connected it.\nDo: commit its files first. ",[518,1188,852],{}," names each entry 1.4 left\nwithout a test or setup command where 2.0 finds one, with the connect command\nthat saves it.",[964,1191,1193],{"id":1192},"scripts-json-output-and-the-api","Scripts, JSON output and the API",[526,1195,1196,1254,1278,1287,1342,1358,1371,1414,1437,1470],{},[529,1197,1198,1204,1205,1208,1209,1212,1213,1215,1216,1219,1220],{},[532,1199,1200,1203],{},[518,1201,1202],{},"agent_overrides"," is an object, not JSON text,"," wherever it appears: in\n",[518,1206,1207],{},"kraft view show --json",", in ",[518,1210,1211],{},"kraft item approve --json"," and every other\n",[518,1214,958],{}," answer that carries the item, in the MCP tools' results, and in\n",[518,1217,1218],{},"GET \u002Fapi\u002Fwork-items\u002F{id}",".\n",[526,1221,1222,1237,1244],{},[529,1223,1224,1225,1011,1227,841,1230,1233,1234,1236],{},"In the answers to an action, such as ",[518,1226,1211],{},[518,1228,1229],{},"node_overrides",[518,1231,1232],{},"policy_override"," are objects too, as\n",[518,1235,1207],{}," already had them.",[529,1238,1239,1240,1243],{},"Do: if a script runs ",[518,1241,1242],{},"json.loads"," on one of them, read it as an object\ninstead.",[529,1245,1246,1247,1021,1250,1253],{},"Setting the override works as in 1.4: ",[518,1248,1249],{},"kraft item set-overrides",[518,1251,1252],{},"PATCH \u002Fapi\u002Fwork-items\u002F{id}"," replace the whole override.",[529,1255,1256,1264,1265,1269,1270,1273,1274,1277],{},[532,1257,1258,985,1261,1263],{},[518,1259,1260],{},"budget_cap.cap_usd",[518,1262,1207],{}," is the cap that stops the\nitem first:"," the lower of its own cap and its ",[514,1266,1268],{"href":1267},"\u002Fconcepts\u002Fvocabulary#policy","policy","'s item-wide\n",[518,1271,1272],{},"budget_usd",". Do: read ",[518,1275,1276],{},"budget_cap.key"," to tell which one it is.",[529,1279,1280,1286],{},[532,1281,1282,1285],{},[518,1283,1284],{},"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.",[529,1288,1289,1119,1292,857,1295,857,1298,1011,1301,857,1304,857,1307,857,1310,857,1313,857,1316,857,1319,1021,1322,857,1325,841,1328,1331,1332,594,1335,1338,1339,1341],{},[532,1290,1291],{},"Action commands print one line.",[518,1293,1294],{},"kraft item approve",[518,1296,1297],{},"reject",[518,1299,1300],{},"pause",[518,1302,1303],{},"resume",[518,1305,1306],{},"retry",[518,1308,1309],{},"raise-budget",[518,1311,1312],{},"skip",[518,1314,1315],{},"complete",[518,1317,1318],{},"cancel",[518,1320,1321],{},"escalate",[518,1323,1324],{},"set-chain",[518,1326,1327],{},"kraft item resolve",[518,1329,1330],{},"reopen"," (one line naming the thread),\nand ",[518,1333,1334],{},"kraft item review approve",[518,1336,1337],{},"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 ",[518,1340,958],{},", which is unchanged.",[529,1343,1344,1349,1350,1353,1354,1357],{},[532,1345,1346,1348],{},[518,1347,828],{}," with no server running exits 1."," 1.4 exited 0.\n",[518,1351,1352],{},"update --restart"," is unchanged. Do: a script that runs it under ",[518,1355,1356],{},"set -e","\nstops there, so start the server first.",[529,1359,1360,1367,1368,1370],{},[532,1361,1362,841,1364,1366],{},[518,1363,828],{},[518,1365,1352],{}," list the running items first.","\nIn a terminal they ask before going on (",[518,1369,1168],{}," skips the question); a script\nwith no terminal only prints the list. 1.4 restarted without asking. No action.",[529,1372,1373,1119,1376,1379,1380,1021,1383,1386,1387,1390,1391,1394,1395,1398,1399,1402,1403,1406,1407,1409,1410,1413],{},[532,1374,1375],{},"A review comment names a file inside the repository, and a suggestion goes on\nnew-side lines.",[518,1377,1378],{},"kraft item comment",", the MCP tool ",[518,1381,1382],{},"add_review_comment",[518,1384,1385],{},"POST \u002Fapi\u002Fwork-items\u002F{id}\u002Fthreads"," refuse an absolute ",[518,1388,1389],{},"--file"," path, or one\nwith ",[518,1392,1393],{},"..",", with a ",[518,1396,1397],{},"422",", and ",[518,1400,1401],{},"kraft item comment --suggest"," with ",[518,1404,1405],{},"--side old","\nexits 2 (the API answers ",[518,1408,1397],{},"). 1.4 stored both. Do: use a repository-relative\npath, and ",[518,1411,1412],{},"--side new"," for a suggestion.",[529,1415,1416,1119,1419,857,1421,857,1424,1426,1427,1430,1431,1394,1434,1436],{},[532,1417,1418],{},"A model override that is not a model id is refused.",[518,1420,1249],{},[518,1422,1423],{},"kraft item set-node-override",[518,1425,1252],{},"\nand a retry that changes a task's model (",[518,1428,1429],{},"task_config.model",") answer one, such\nas ",[518,1432,1433],{},"--model \"my model\"",[518,1435,1397],{},". 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.",[529,1438,1439,1442],{},[532,1440,1441],{},"Escalating an item a spend cap stopped is refused, and so is raising a cap\nto what the item has already spent.",[526,1443,1444,1458,1467],{},[529,1445,1446,1449,1450,1453,1454,1457],{},[518,1447,1448],{},"kraft item escalate"," (and ",[518,1451,1452],{},"POST \u002Fapi\u002Fwork-items\u002F{id}\u002Fescalate",") on an item\nany spend cap stopped, the daily cap included, answers ",[518,1455,1456],{},"409"," and points to\nthe cap to raise. 1.4 started an escalation that the same cap then stopped.",[529,1459,1460,1463,1464,1466],{},[518,1461,1462],{},"kraft item raise-budget"," with a cap at or below what the item has spent\nanswers ",[518,1465,1397],{},". 1.4 saved it and the item stopped again at once.",[529,1468,1469],{},"Do: raise the cap above the spend.",[529,1471,1472,1119,1480,1379,1483,857,1486,841,1488,1490,1491,1493,1494,1497,1498],{},[532,1473,1474,1475,1479],{},"A ",[514,1476,1478],{"href":1477},"\u002Fconcepts\u002Fvocabulary#work-item","work item"," title is one line of plain text, and not blank.",[518,1481,1482],{},"kraft item create",[518,1484,1485],{},"create_work_item",[518,1487,1020],{},[518,1489,1252],{}," 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 ",[518,1492,1397],{},". 1.4 filed or saved it (only a blank ",[518,1495,1496],{},"PATCH","\ntitle was refused).\n",[526,1499,1500,1506,1521],{},[529,1501,1502,1503,524],{},"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 ",[518,1504,1505],{},"description",[529,1507,1508,1509,1511,1512,1516,1517,1520],{},"A schedule's title (a ",[518,1510,310],{}," cron ",[514,1513,1515],{"href":1514},"\u002Fconcepts\u002Fvocabulary#trigger","trigger"," in 1.4), and ",[532,1518,1519],{},"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).",[529,1522,1523,1526],{},[518,1524,1525],{},"kraft view list"," shows the first line of a title 1.4 stored with a line\nbreak, without its control characters.",[510,1528,1529],{},[532,1530,1531,1532,1535,1536,1539],{},"Chains are named ",[518,1533,1534],{},"chain",", not ",[518,1537,1538],{},"template",", in commands, tools and the API.",[1541,1542,1543,1559],"table",{},[1544,1545,1546],"thead",{},[1547,1548,1549,1553,1556],"tr",{},[1550,1551,1552],"th",{},"Before",[1550,1554,1555],{},"Now",[1550,1557,1558],{},"What to do",[1560,1561,1562,1583,1608,1627,1644,1666],"tbody",{},[1547,1563,1564,1570,1580],{},[1565,1566,1567],"td",{},[518,1568,1569],{},"kraft item set-chain --template",[1565,1571,1572,1575,1576,1579],{},[518,1573,1574],{},"--chain","; ",[518,1577,1578],{},"--template"," still works",[1565,1581,1582],{},"Nothing.",[1547,1584,1585,1591,1603],{},[1565,1586,1587,1588],{},"The MCP tool ",[518,1589,1590],{},"set_chain_template",[1565,1592,1593,1596,1597,1599,1600,1602],{},[518,1594,1595],{},"set_chain",", with ",[518,1598,1534],{}," for ",[518,1601,1538],{},"; the old tool name no longer exists",[1565,1604,1605,1606,524],{},"Change an agent prompt or skill that names ",[518,1607,1590],{},[1547,1609,1610,1618,1622],{},[1565,1611,1612,1615,1616],{},[518,1613,1614],{},"chain_template"," in the MCP tool ",[518,1617,1485],{},[1565,1619,1620],{},[518,1621,1534],{},[1565,1623,1624,1625,524],{},"Use ",[518,1626,1534],{},[1547,1628,1629,1635,1642],{},[1565,1630,1631,985,1633],{},[518,1632,1614],{},[518,1634,1020],{},[1565,1636,1637,1575,1639,1641],{},[518,1638,1534],{},[518,1640,1614],{}," is still read",[1565,1643,1582],{},[1547,1645,1646,1657,1664],{},[1565,1647,1648,985,1651,841,1654],{},[518,1649,1650],{},"default_chain_template",[518,1652,1653],{},"POST",[518,1655,1656],{},"PATCH \u002Fapi\u002Frepos",[1565,1658,1659,1575,1662,1641],{},[518,1660,1661],{},"default_chain",[518,1663,1650],{},[1565,1665,1582],{},[1547,1667,1668,1685,1689],{},[1565,1669,1670,1672,1673,857,1676,1379,1679,841,1682],{},[518,1671,1650],{}," in the answers of ",[518,1674,1675],{},"kraft repo list --json",[518,1677,1678],{},"kraft repo connect --json",[518,1680,1681],{},"ensure_repo",[518,1683,1684],{},"GET \u002Fapi\u002Frepos",[1565,1686,1687],{},[518,1688,1661],{},[1565,1690,1691,1692,1694],{},"Read ",[518,1693,1661],{}," in a script that uses the key.",[964,1696,693],{"id":1697},"config-directory-and-files",[526,1699,1700,1806,1830,1859],{},[529,1701,1702,1705,1706,1709,1710,1713,1714],{},[532,1703,1704],{},"The config directory."," The config directory is ",[518,1707,1708],{},"$KRAFT_HOME\u002Fconfig\u002F",", not\n",[518,1711,1712],{},"templates\u002F",". Do: nothing for a default home; the first start renames it. The\nrest of this item says what that touches.\n",[526,1715,1716,1726,1736,1762,1777,1796],{},[529,1717,1718,1719,1722,1723,1725],{},"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. ",[518,1720,1721],{},"templates"," is left as a link to ",[518,1724,866],{},", so\na 1.4 process still running (an MCP server under an agent) and a path in a\nscript keep working.",[529,1727,1728,1731,1732,1735],{},[518,1729,1730],{},"KRAFT_CONFIG_DIR"," names it. ",[518,1733,1734],{},"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.",[529,1737,1474,1738,1741,1742,1746,1747,1750,1751,1753,1754,1756,1757,927,1759,1761],{},[518,1739,1740],{},"config\u002F"," you made before the first start, such as the ",[514,1743,1745],{"href":1744},"\u002Fconcepts\u002Fvocabulary#harness","harness"," guide's\n",[518,1748,1749],{},"config\u002Fharnesses",", gets what it lacks moved in (an empty directory in\n",[518,1752,1712],{}," is removed). Whatever both hold stays in ",[518,1755,1712],{},", and\n",[518,1758,852],{},[518,1760,866],{}," row names both until you merge them.",[529,1763,1764,1765,1767,1768,1770,1771,1773,1774,1776],{},"If a service unit or a shell sets ",[518,1766,1734],{}," to the old default\nand you also made a ",[518,1769,1740],{},", 2.0 refuses to start until you merge\n",[518,1772,1712],{}," into ",[518,1775,1740],{}," and remove it.",[529,1778,1779,1780,1782,1783,1786,1787,1789,1790,1792,1793,1795],{},"A directory you point at anywhere else is never renamed. A ",[518,1781,1721],{}," that\nis a link to another directory (a dotfiles repo) is not renamed or merged\neither, and its files are not read, except a ",[518,1784,1785],{},"harnesses\u002F"," directory in it,\nwhich stays read until a ",[518,1788,1749],{}," exists. The start prints a\nwarning naming the target, and the ",[518,1791,866],{}," row warns the same. Do: set\n",[518,1794,1730],{}," to that target.",[529,1797,1798,1801,1802,1535,1804,524],{},[518,1799,1800],{},"kraft admin doctor --json"," names the row ",[518,1803,866],{},[518,1805,1721],{},[529,1807,1808,1814,1815,1817,1818,1821,1822,1825,1826,1829],{},[532,1809,1810,1811,1813],{},"A schedule's day of week ",[518,1812,688],{}," is Sunday, as in cron."," 1.4 accepted ",[518,1816,688],{}," and\nnever fired it. Ranges (",[518,1819,1820],{},"1-5",") and steps (",[518,1823,1824],{},"*\u002F15",") work since 2.0. Do: a\n",[518,1827,1828],{},"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.",[529,1831,1832,1838,1839,1842,1843,1846,1847,1849,1850,1853,1854,1858],{},[532,1833,1474,1834,1837],{},[518,1835,1836],{},"steering\u002F"," directory is no longer read."," 0.x read a directory of ",[518,1840,1841],{},".md","\nfiles, and 1.x folded it into ",[518,1844,1845],{},"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 ",[518,1848,1845],{},"'s\n",[518,1851,1852],{},"steering:"," by hand, because 2.0 loses them as steering\n(",[514,1855,1857],{"href":1856},"\u002Fguides\u002Frun\u002Fupgrade-from-0-x-or-a-release-candidate#migrating-a-home-from-0x","Upgrade from 0.x","\nhas the update).",[529,1860,1861,1872,1873,1876,1877,1880,1881,1884],{},[532,1862,1863,985,1866,1868,1869],{},[514,1864,404],{"href":1865},"\u002Fconcepts\u002Fvocabulary#agent-profile",[518,1867,318],{}," are written as ",[518,1870,1871],{},"providers:"," (per\nprovider, ",[518,1874,1875],{},"{model, effort}","), the shape Settings › Harnesses edits. The older\n",[518,1878,1879],{},"model:"," map with one ",[518,1882,1883],{},"effort"," still loads. No action.",[510,1886,1887,1890,1891,985,1894,1896,1897,1899,1900,927,1902,1904],{},[532,1888,1889],{},"Three keys moved."," Every old place is still read, so a hand-written file\nstops nothing, except ",[518,1892,1893],{},"max_concurrent",[518,1895,326],{},": the server ignores it,\nwith a warning, until the next start moves it to ",[518,1898,310],{},". ",[518,1901,852],{},[518,1903,860],{}," row names each old place you still have.",[1541,1906,1907,1917],{},[1544,1908,1909],{},[1547,1910,1911,1913,1915],{},[1550,1912,1552],{},[1550,1914,1555],{},[1550,1916,1558],{},[1560,1918,1919,1939,1960,1974],{},[1547,1920,1921,1928,1936],{},[1565,1922,1923,985,1926],{},[518,1924,1925],{},"triggers:",[518,1927,310],{},[1565,1929,1930,985,1933,1935],{},[518,1931,1932],{},"schedules:",[518,1934,326],{},", edited on Settings › Auto-intake",[1565,1937,1938],{},"Nothing: the first start moves it.",[1547,1940,1941,1947,1954],{},[1565,1942,1943,985,1945],{},[518,1944,1893],{},[518,1946,326],{},[1565,1948,1949,985,1951,1953],{},[518,1950,1893],{},[518,1952,310],{},", on Settings › Policy › Housekeeping",[1565,1955,1956,1957,1959],{},"Nothing: the first start moves it, unless ",[518,1958,310],{}," already sets one.",[1547,1961,1962,1967,1971],{},[1565,1963,1964,1966],{},[518,1965,1650],{}," in a repo entry",[1565,1968,1969],{},[518,1970,1661],{},[1565,1972,1973],{},"Nothing: the old key is still read.",[1547,1975,1976,1983,1988],{},[1565,1977,1978,985,1981],{},[518,1979,1980],{},"board.group_by: template",[518,1982,334],{},[1565,1984,1985],{},[518,1986,1987],{},"board.group_by: chain",[1565,1989,1990,1991,524],{},"Nothing: the old value reads as ",[518,1992,1534],{},[510,1994,1995],{},"Unless the notes below apply, there is nothing to do:",[526,1997,1998,2019,2026,2035,2041,2053],{},[529,1999,2000,2001,927,2003,2005,2006,985,2008,2010,2011,1119,2013,2015,2016,2018],{},"The first start carries the first two, in the renamed home or in one you point\nat by hand: ",[518,2002,310],{},[518,2004,1925],{}," become ",[518,2007,1932],{},[518,2009,326],{},",\nand an ",[518,2012,326],{},[518,2014,1893],{}," moves to ",[518,2017,310],{}," unless it\nalready sets one.",[529,2020,2021,2022,2025],{},"Each file a key moves between is rewritten, readable by you alone (",[518,2023,2024],{},"0600",");\nthe rest of it keeps its comments and layout.",[529,2027,2028,2029,2031,2032,2034],{},"A moved trigger takes its comments with it: the lines above it and the ones\non its own lines. A comment line above ",[518,2030,1925],{}," itself stays in\n",[518,2033,310],{},", even once every trigger has moved, when it sits over the next\nkey: delete it by hand.",[529,2036,2037,2038,2040],{},"A comment on the ",[518,2039,1893],{}," line is dropped. If keeping a file's\ncomments would leave it unreadable, the start writes it without them, and its\nlog says so.",[529,2042,2043,2044,2046,2047,2049,2050,2052],{},"A trigger 2.0's schedule refuses (1.4 ignored an extra key such as\n",[518,2045,662],{},") stays in ",[518,2048,310],{},", still read and fired, and the rest\nmove. Doctor's ",[518,2051,860],{}," row names the key that keeps each one there (the\nstart's log names only the first).",[529,2054,2055,2056,2059,2060,1011,2063,2066,2067,2070,2071,2074,2075,2077],{},"A trigger whose ",[518,2057,2058],{},"cron"," names a value outside its field (",[518,2061,2062],{},"0 24 * * *",[518,2064,2065],{},"0 9 * * 8","), which 1.4 loaded and never ran, or a number in digits other\nthan 0-9 (",[518,2068,2069],{},"²",", which 1.4 never ran, or ",[518,2072,2073],{},"٣",", which it ran as 3), stays in\n",[518,2076,310],{}," too and is skipped, with a warning, rather than refusing the\nfile.",[510,2079,2080,2086,2087,1849,2089,2091,2092,2095,2096,841,2099,524],{},[532,2081,2082,2083,2085],{},"Four ",[518,2084,292],{}," keys an older Kraft wrote are not read."," A repo still\ncarrying one loads, the server log names it once, and ",[518,2088,852],{},[518,2090,856],{}," row warns, naming what replaced it. ",[518,2093,2094],{},"gitlab_project"," is still read as\n",[518,2097,2098],{},"forge: gitlab",[518,2100,2101],{},"project:",[1541,2103,2104,2114],{},[1544,2105,2106],{},[1547,2107,2108,2110,2112],{},[1550,2109,1552],{},[1550,2111,1555],{},[1550,2113,1558],{},[1560,2115,2116,2137,2149,2167],{},[1547,2117,2118,2123,2134],{},[1565,2119,2120],{},[518,2121,2122],{},"default_model",[1565,2124,2125,2126,2130,2131],{},"A model per ",[514,2127,2129],{"href":2128},"\u002Fconcepts\u002Fvocabulary#harness-profile","harness profile"," under ",[518,2132,2133],{},"models:",[1565,2135,2136],{},"Replace the key.",[1547,2138,2139,2144,2147],{},[1565,2140,2141],{},[518,2142,2143],{},"submodules",[1565,2145,2146],{},"Each submodule as an entry of its own",[1565,2148,2136],{},[1547,2150,2151,2156,2165],{},[1565,2152,2153],{},[518,2154,2155],{},"default_root_merge_policy",[1565,2157,1474,2158,927,2162],{},[514,2159,2161],{"href":2160},"\u002Fconcepts\u002Fvocabulary#workspace","workspace",[518,2163,2164],{},"root_pointer_default",[1565,2166,2136],{},[1547,2168,2169,2174,2177],{},[1565,2170,2171],{},[518,2172,2173],{},"allow_cross_repo",[1565,2175,2176],{},"Nothing",[1565,2178,2179],{},"Remove it.",[964,2181,2183],{"id":2182},"permission-hooks","Permission hooks",[526,2185,2186],{},[529,2187,2188,2194,2195,2198,2199,2201,2202,2204,2205,524],{},[532,2189,2190,2191,524],{},"Cursor's hook entry runs Kraft's Python with ",[518,2192,2193],{},"-I"," 1.4 wrote the entry in a\nworktree's ",[518,2196,2197],{},".cursor\u002Fhooks.json"," without ",[518,2200,2193],{},". The server adds ",[518,2203,2193],{}," to each\nexisting worktree's entry when it starts, so a worktree that already exists\ngets it too. No action. See ",[514,2206,420],{"href":2207},"\u002Freference\u002Fpermissions#cursor",[964,2209,2211],{"id":2210},"the-interface","The interface",[526,2213,2214,2225,2239,2247],{},[529,2215,2216,2219,2220,2224],{},[532,2217,2218],{},"2.0 replaces the interface, and some pages moved."," Old addresses still open\nthe right page. No action: see ",[514,2221,2223],{"href":2222},"#where-the-pages-moved","Where the pages moved","\nfor where each one went.",[529,2226,2227,2230,2231,2233,2234,2238],{},[532,2228,2229],{},"The theme file changes once."," The first start rewrites ",[518,2232,334],{}," so the\nlook you had stays. No action: see ",[514,2235,2237],{"href":2236},"#your-theme","Your theme"," if it looks wrong.",[529,2240,2241,2244,2245,524],{},[532,2242,2243],{},"The phone layout"," shows on a screen narrower than 768 pixels, with the same\npages behind a bottom bar. No action: see\n",[514,2246,88],{"href":89},[529,2248,2249,2252,2253,524],{},[532,2250,2251],{},"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",[514,2254,2256],{"href":2255},"\u002Fguides\u002Fday-to-day\u002Fvscode#if-the-extension-is-read-only","VS Code",[557,2258,2223],{"id":2259},"where-the-pages-moved",[510,2261,2262],{},"Kraft 2.0 replaced the interface. The old pages moved, and the old addresses\nstill open the right page.",[1541,2264,2265,2273],{},[1544,2266,2267],{},[1547,2268,2269,2271],{},[1550,2270,1552],{},[1550,2272,1555],{},[1560,2274,2275,2287,2304,2323,2335,2348,2361,2372],{},[1547,2276,2277,2280],{},[1565,2278,2279],{},"Settings › Chains, and the old Templates page",[1565,2281,2282,2283,2286],{},"Templates › Chains (",[518,2284,2285],{},"\u002Ftemplates\u002Fchains",")",[1547,2288,2289,2292],{},[1565,2290,2291],{},"Settings › Library and Steering",[1565,2293,2294,2295,2298,2299,2303],{},"Templates › Library (",[518,2296,2297],{},"\u002Ftemplates\u002Flibrary","); ",[514,2300,2302],{"href":2301},"\u002Fconcepts\u002Fvocabulary#steering-profile","steering profiles"," are library components",[1547,2305,2306,2309],{},[1565,2307,2308],{},"Settings › Repos and Settings › Harnesses",[1565,2310,2311,2312,857,2315,2318,2319,2322],{},"Still under Settings (",[518,2313,2314],{},"\u002Fsettings\u002Frepos",[518,2316,2317],{},"\u002Fsettings\u002Fharnesses","); the ",[518,2320,2321],{},"\u002Ftemplates\u002F..."," addresses the 2.0 release candidates gave them open the same pages",[1547,2324,2325,2332],{},[1565,2326,2327,2328,2331],{},"Settings › Plugins (",[518,2329,2330],{},"\u002Fsettings\u002Fplugins",", a redirect to Settings › Chains already in 1.4)",[1565,2333,2334],{},"Templates › Chains",[1547,2336,2337,2343],{},[1565,2338,2339,2340,2286],{},"Settings › Notifications (",[518,2341,2342],{},"\u002Fsettings\u002Fnotify",[1565,2344,2339,2345,2286],{},[518,2346,2347],{},"\u002Fsettings\u002Fnotifications",[1547,2349,2350,2356],{},[1565,2351,2352,2353,2286],{},"Settings › Auto-intake (",[518,2354,2355],{},"\u002Fsettings\u002Fintake",[1565,2357,2352,2358,2286],{},[518,2359,2360],{},"\u002Fsettings\u002Fauto-intake",[1547,2362,2363,2366],{},[1565,2364,2365],{},"Settings (the front page)",[1565,2367,2368,2369,2286],{},"Settings › Policy (",[518,2370,2371],{},"\u002Fsettings\u002Fpolicy",[1547,2373,2374,2380],{},[1565,2375,2376,2377,2286],{},"The Search page (",[518,2378,2379],{},"\u002Fsearch",[1565,2381,2382,2383,650,2386,2389],{},"The board, with the search box on ",[532,2384,2385],{},"⌘K",[532,2387,2388],{},"Ctrl+K",") from any page",[510,2391,2392,2393,2396,2397,524],{},"Repos, Harnesses, Policy, Access and Appearance stayed under Settings. About is\nstill at ",[518,2394,2395],{},"\u002Fsettings\u002Fabout",": on the desktop it opens from the version line at the\nfoot of the sidebar, and on a phone from ",[532,2398,2399],{},"More",[510,2401,2402],{},"A bookmark to an old address opens the page that replaced it, and keeps its\nquery string. Two older kinds of address:",[526,2404,2405,2412],{},[529,2406,2407,2408,2411],{},"An address from the preview of the new interface, which began with ",[518,2409,2410],{},"\u002Fng",",\ndrops that prefix and opens the same page.",[529,2413,2414,2415,2418,2419,2422],{},"A bookmark to an item's old tab address (",[518,2416,2417],{},"\u002Fwork-items\u002FID#tab=changes",") opens\nthe item's review page, and one to a node (",[518,2420,2421],{},"#node=NAME",") opens that node.",[510,2424,2425,2426,2429,2430,2433,2434,524],{},"The ",[532,2427,2428],{},"Current UI"," link and the ",[532,2431,2432],{},"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 ",[514,2435,88],{"href":89},[557,2437,2237],{"id":2438},"your-theme",[510,2440,2441,2442,857,2445,841,2448,2451,2452,2455,2456,2458,2459,2461,2462,2465,2466,2469,2470,2473],{},"The 2.0 interface chooses color with ",[518,2443,2444],{},"surface",[518,2446,2447],{},"accent",[518,2449,2450],{},"colour_amount",",\nnot ",[518,2453,2454],{},"palette",". The first start after the upgrade rewrites ",[518,2457,334],{}," once, so\nthe look you had stays: your old ",[518,2460,2454],{}," is replaced by the three keys that\ndraw it, and the original file is kept as ",[518,2463,2464],{},"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: ",[518,2467,2468],{},"theme.yaml.pre-1.5",", or ",[518,2471,2472],{},"theme.yaml.pre-ux2","\nfrom 1.5.0rc5 to rc9.",[510,2475,2476,2477,841,2479,2481,2482,2484,2485,2487,2488,524],{},"Which ",[518,2478,2444],{},[518,2480,2447],{}," each old ",[518,2483,2454],{}," becomes, and what happens to a\n",[518,2486,2454],{}," that reappears, is in\n",[514,2489,2491,2493],{"href":2490},"\u002Freference\u002Fconfiguration\u002Ftheme#palette-is-legacy",[518,2492,2454],{}," is legacy",[510,2495,2496],{},"If it still looks wrong:",[526,2498,2499,2506,2519,2530],{},[529,2500,2501,2502,2505],{},"Open ",[532,2503,2504],{},"Settings › Appearance"," and pick the surface, accent and amount of\ncolor you want. That is the supported way to change them.",[529,2507,2508,2509,2512,2513,2515,2516,2518],{},"To go back to the file as it was before the upgrade, stop Kraft, copy\n",[518,2510,2511],{},"~\u002F.kraft\u002Fconfig\u002Ftheme.yaml.pre-2.0"," (or the candidate's copy named above) over\n",[518,2514,334],{},", and start it again. The next start converts its ",[518,2517,2454],{}," once\nmore. The saved copy is never overwritten.",[529,2520,1474,2521,2523,2524,2526,2527,2529],{},[518,2522,334],{}," 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. ",[518,2525,852],{}," has no row for this file: fix the key by hand\n(",[514,2528,334],{"href":335}," lists them), or delete the\nfile to start from the defaults.",[529,2531,2532,2535],{},[518,2533,2534],{},"mode: system"," follows your operating system's light or dark setting.",[557,2537,2539],{"id":2538},"next-steps","Next steps",[526,2541,2542,2547,2552,2557],{},[529,2543,2544,2546],{},[514,2545,164],{"href":165},": the backup, the update and the check that every upgrade uses",[529,2548,2549,2551],{},[514,2550,180],{"href":181},": go back if the upgrade went wrong",[529,2553,2554,2556],{},[514,2555,152],{"href":153},": take the backup 1.4 needs and find the copy to roll back to",[529,2558,2559,2561],{},[514,2560,485],{"href":486},": what you get for these changes",{"title":2563,"searchDepth":2564,"depth":2564,"links":2565},"",2,[2566,2567,2569,2570,2572,2581,2582,2583],{"id":559,"depth":2564,"text":560},{"id":608,"depth":2564,"text":2568},"Update from 1.​4",{"id":832,"depth":2564,"text":833},{"id":873,"depth":2564,"text":2571},"If you used 1.​4's update anyway",{"id":947,"depth":2564,"text":544,"children":2573},[2574,2576,2577,2578,2579,2580],{"id":966,"depth":2575,"text":642},3,{"id":1060,"depth":2575,"text":666},{"id":1192,"depth":2575,"text":1193},{"id":1697,"depth":2575,"text":693},{"id":2182,"depth":2575,"text":2183},{"id":2210,"depth":2575,"text":2211},{"id":2259,"depth":2564,"text":2223},{"id":2438,"depth":2564,"text":2237},{"id":2538,"depth":2564,"text":2539},"What 2.0 changes from 1.4 and what to do about each change, and the steps to update from 1.4 without losing the database.","md",null,{},true,{"title":172,"description":2584},"hU4OWDLMariJAfxCsFUiySh2VHCnkq1pQfZSONFcooc",[2592,2594],{"title":168,"path":169,"stem":170,"description":2593,"children":-1},"Pick up new shipped chains, library tasks and policy after a Kraft upgrade, without losing your own edits.",{"title":176,"path":177,"stem":178,"description":2595,"children":-1},"Upgrade to 2.0 from a 1.5.0 release candidate, from an install made before the kraft-sdlc rename, or from a Kraft 0.x home that holds the old template configuration.",1791801253370]