[{"data":1,"prerenderedAt":2757},["ShallowReactive",2],{"navigation_docs":3,"-guides-run-roll-back":504,"-guides-run-roll-back-surround":2752},[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":180,"body":506,"description":2745,"extension":2746,"links":2747,"meta":2748,"navigation":2749,"path":181,"seo":2750,"stem":182,"__hash__":2751},"docs\u002F3.guides\u002F4.run\u002F11.roll-back.md",{"type":507,"value":508,"toc":2733},"minimark",[509,522,527,568,572,575,591,615,2124,2127,2130,2140,2148,2157,2181,2186,2189,2376,2380,2387,2517,2522,2534,2550,2556,2708,2712,2729],[510,511,512,513,517,518,521],"p",{},"You will be on Kraft 1.4 again, with the database as 1.4 left it, and ",[514,515,516],"code",{},"kraft --version"," prints ",[514,519,520],{},"kraft 1.4.0",". A rollback needs that database, so take a backup before you upgrade. Step 1 checks that you have one, before it changes anything.",[523,524,526],"h2",{"id":525},"before-you-start","Before you start",[528,529,530,544,547,550,557,560],"ul",{},[531,532,533,534,539,540,543],"li",{},"You have the database as 1.4 left it, schema 44: a ",[535,536,538],"a",{"href":537},"\u002Fguides\u002Frun\u002Fback-up-and-restore#back-up-the-database","backup you took before the upgrade"," (a ",[514,541,542],{},"kraft-backup-\u003Cdate>.db"," file in your home folder), or the copy Kraft made when you first left 1.4. That copy is not always the newest: a later upgrade adds a newer one that holds the schema before it, which 1.4 refuses. Step 1 finds the right one, and only reads.",[531,545,546],{},"When you upgraded to a 1.5.0 release candidate before 1.5.0rc12, Kraft made no copy, and only a backup you took yourself rolls back.",[531,548,549],{},"You know the Python Kraft runs on, and whether you use vector search. Step 3 installs 1.4 with both.",[531,551,552,553,556],{},"The ",[514,554,555],{},"sqlite3"," command, for the schema checks in steps 1 and 4. Step 1 has a Python form for a machine without it.",[531,558,559],{},"You accept that the restore loses everything done on 2.0 since that backup: items filed, runs, approvals and their history.",[531,561,562,563,567],{},"If Kraft runs as a service, you know how to ",[535,564,566],{"href":565},"\u002Fguides\u002Frun\u002Frun-as-a-service#stop-a-service","stop a service",".",[523,569,571],{"id":570},"roll-back-from-20-to-14","Roll back from 2.0 to 1.4",[510,573,574],{},"Step 1 only checks, so if it finds no database you stop there and stay on 2.0.",[510,576,577,578,585,586,590],{},"Steps 2 to 4 put back the release and the database. Steps 5 to 12 undo what 2.0 changed in the config directory, one file at a time: ",[535,579,581,582],{"href":580},"#what-a-rollback-does-to-kraft_home","What a rollback does to ",[514,583,584],{},"$KRAFT_HOME"," lists them in one table. Step 13 starts 1.4. A step you skip, or get wrong, shows up as a symptom: ",[535,587,589],{"href":588},"#if-14-will-not-start-or-misbehaves","If 1.4 will not start or misbehaves"," lists them by what you see and names the step that fixes each.",[510,592,593,594,597,598,601,602,597,604,607,608,610,611,614],{},"The commands that name your Kraft home set ",[514,595,596],{},"home"," or ",[514,599,600],{},"run"," themselves, from ",[514,603,584],{},[514,605,606],{},"~\u002F.kraft"," (",[514,609,600],{}," from ",[514,612,613],{},"$KRAFT_RUN_DIR"," first, as Kraft does), so each block works in a new terminal.",[616,617,618,747,786,873,1027,1517,1560,1603,1626,1643,1678,1839,2111],"ol",{},[531,619,620,621,624,625,629,630,633,634,686,697,699,700,702,703,738,740,741,743,744,567],{},"Check that you have a database 1.4 can read, before you stop or install\nanything. Pick the database to restore: your own backup, or the copy Kraft\nmade when you first left 1.4. Both must hold schema 44.",[622,623],"br",{},"To find Kraft's copy, follow\n",[535,626,628],{"href":627},"\u002Fguides\u002Frun\u002Fback-up-and-restore#find-the-copy-to-restore","Find the copy to restore",":\nit is the newest one that prints 44. For your own backup, set ",[514,631,632],{},"backup"," to it;\nthe command prints its schema, and a backup taken after the upgrade does not\nprint 44. Put the path of your backup in the first line, in place of the\nexample:",[635,636,641],"pre",{"className":637,"code":638,"language":639,"meta":640,"style":640},"language-bash shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","backup=\"$HOME\u002Fkraft-backup-20261002-093015.db\"\nsqlite3 -readonly \"$backup\" 'PRAGMA user_version'\n","bash","",[514,642,643,665],{"__ignoreMap":640},[644,645,648,651,655,659,662],"span",{"class":646,"line":647},"line",1,[644,649,632],{"class":650},"s7iLA",[644,652,654],{"class":653},"sklAV","=",[644,656,658],{"class":657},"semJd","\"",[644,660,661],{"class":650},"$HOME",[644,663,664],{"class":657},"\u002Fkraft-backup-20261002-093015.db\"\n",[644,666,668,671,675,678,681,683],{"class":646,"line":667},2,[644,669,555],{"class":670},"szw1H",[644,672,674],{"class":673},"ssYy9"," -readonly",[644,676,677],{"class":657}," \"",[644,679,680],{"class":650},"$backup",[644,682,658],{"class":657},[644,684,685],{"class":657}," 'PRAGMA user_version'\n",[635,687,692],{"className":688,"code":690,"language":691,"meta":640},[689],"language-text","44\n","text",[514,693,694],{"__ignoreMap":640},[644,695,690],{"className":696},[646],[622,698],{},"Without the ",[514,701,555],{}," command, Python prints the same:",[635,704,706],{"className":637,"code":705,"language":639,"meta":640,"style":640},"backup=\"$HOME\u002Fkraft-backup-20261002-093015.db\"\npython3 -c \"import sqlite3, sys; print(sqlite3.connect('file:' + sys.argv[1] + '?mode=ro', uri=True).execute('PRAGMA user_version').fetchone()[0])\" \"$backup\"\n",[514,707,708,720],{"__ignoreMap":640},[644,709,710,712,714,716,718],{"class":646,"line":647},[644,711,632],{"class":650},[644,713,654],{"class":653},[644,715,658],{"class":657},[644,717,661],{"class":650},[644,719,664],{"class":657},[644,721,722,725,728,731,733,735],{"class":646,"line":667},[644,723,724],{"class":670},"python3",[644,726,727],{"class":673}," -c",[644,729,730],{"class":657}," \"import sqlite3, sys; print(sqlite3.connect('file:' + sys.argv[1] + '?mode=ro', uri=True).execute('PRAGMA user_version').fetchone()[0])\"",[644,732,677],{"class":657},[644,734,680],{"class":650},[644,736,737],{"class":657},"\"\n",[622,739],{},"Write down the path of the file you pick: step 4 uses it.",[622,742],{},"If no copy prints 44 and you have no backup of your own, stop here. Nothing\nhas changed, and you stay on 2.0. Which releases made no copy is in\n",[535,745,526],{"href":746},"#before-you-start",[531,748,749,750,567,753,755,756,759,760,762,763,517,765,768,769,772,773,776,777],{},"Stop Kraft with ",[514,751,752],{},"kraft admin stop",[622,754],{},"If Kraft runs as a service, stop it as\n",[535,757,758],{"href":565},"Stop a service"," says instead:\nthe service manager starts a stopped server again, and the next steps must not\nrun under a live one.",[622,761],{},"Go on only when ",[514,764,752],{},[514,766,767],{},"kraft: stopped (pid N)"," or\n",[514,770,771],{},"kraft: no server running",". If it prints ",[514,774,775],{},"kraft: pid N did not stop within 15s","\nand exits 1, the server is still running: do not touch the database.",[635,778,781],{"className":779,"code":780,"language":691,"meta":640},[689],"kraft: stopped (pid 48213)\n",[514,782,783],{"__ignoreMap":640},[644,784,780],{"className":785},[646],[531,787,788,789,793,794,797,798,826,828,829,833,834,836,837,850,859,861,862,865,866,868,869,872],{},"Install 1.4 with the Python you run Kraft on and the extra you have. On\nHomebrew, which cannot install an older release, skip the command below and\nsee ",[535,790,792],{"href":791},"\u002Fguides\u002Frun\u002Fupgrade-kraft#pin-a-version","Pin a version",". Leave out\n",[514,795,796],{},"[vector]"," if you don't use vector search:",[635,799,801],{"className":637,"code":800,"language":639,"meta":640,"style":640},"uv tool install --force --python 3.X \"kraft-sdlc[vector]==1.4.0\"\n",[514,802,803],{"__ignoreMap":640},[644,804,805,808,811,814,817,820,823],{"class":646,"line":647},[644,806,807],{"class":670},"uv",[644,809,810],{"class":657}," tool",[644,812,813],{"class":657}," install",[644,815,816],{"class":673}," --force",[644,818,819],{"class":673}," --python",[644,821,822],{"class":657}," 3.X",[644,824,825],{"class":657}," \"kraft-sdlc[vector]==1.4.0\"\n",[622,827],{},"If you skipped step 2 and install an older version while the newer server still\nruns, the web UI says ",[830,831,832],"strong",{},"An older Kraft is installed"," and points here, rather\nthan telling you to restart.",[622,835],{},"Check the install:",[635,838,840],{"className":637,"code":839,"language":639,"meta":640,"style":640},"kraft --version\n",[514,841,842],{"__ignoreMap":640},[644,843,844,847],{"class":646,"line":647},[644,845,846],{"class":670},"kraft",[644,848,849],{"class":673}," --version\n",[635,851,854],{"className":852,"code":853,"language":691,"meta":640},[689],"kraft 1.4.0\n",[514,855,856],{"__ignoreMap":640},[644,857,853],{"className":858},[646],[622,860],{},"If it prints another version, 1.4 is not what your shell runs. Read the error\nthe install printed, and run ",[514,863,864],{},"command -v kraft"," to see which ",[514,867,846],{}," comes\nfirst on ",[514,870,871],{},"PATH",". Repeat this step before you go on.",[531,874,875,876,880,881,883,884,886,887,950,958,699,960,702,962,1016,1018,1019,1022,1023,1026],{},"Restore the database from step 1. Follow steps 2 and 3 of\n",[535,877,879],{"href":878},"\u002Fguides\u002Frun\u002Fback-up-and-restore#restore-a-backup","Restore a backup",", in that\norder, with ",[514,882,632],{}," set to the file from step 1. Each block sets its own\nvariables, so they work in one terminal or two. Skip step 1 there, because\nstep 2 here stopped Kraft. Skip its steps 4 and 5 too: steps 5 to 12 here\nhandle the config directory, and step 13 starts Kraft.",[622,885],{},"Check the restored database:",[635,888,890],{"className":637,"code":889,"language":639,"meta":640,"style":640},"run=\"${KRAFT_RUN_DIR:-${KRAFT_HOME:-$HOME\u002F.kraft}\u002Frun}\"\nsqlite3 -readonly \"$run\u002Forchestrator.db\" 'PRAGMA user_version'\n",[514,891,892,934],{"__ignoreMap":640},[644,893,894,896,898,901,904,907,910,913,915,917,920,922,924,927,929,931],{"class":646,"line":647},[644,895,600],{"class":650},[644,897,654],{"class":653},[644,899,900],{"class":657},"\"${",[644,902,903],{"class":650},"KRAFT_RUN_DIR",[644,905,906],{"class":653},":-",[644,908,909],{"class":657},"${",[644,911,912],{"class":650},"KRAFT_HOME",[644,914,906],{"class":653},[644,916,661],{"class":650},[644,918,919],{"class":653},"\u002F",[644,921,567],{"class":657},[644,923,846],{"class":650},[644,925,926],{"class":657},"}",[644,928,919],{"class":653},[644,930,600],{"class":650},[644,932,933],{"class":657},"}\"\n",[644,935,936,938,940,942,945,948],{"class":646,"line":667},[644,937,555],{"class":670},[644,939,674],{"class":673},[644,941,677],{"class":657},[644,943,944],{"class":650},"$run",[644,946,947],{"class":657},"\u002Forchestrator.db\"",[644,949,685],{"class":657},[635,951,953],{"className":952,"code":690,"language":691,"meta":640},[689],[514,954,955],{"__ignoreMap":640},[644,956,690],{"className":957},[646],[622,959],{},[514,961,555],{},[635,963,965],{"className":637,"code":964,"language":639,"meta":640,"style":640},"run=\"${KRAFT_RUN_DIR:-${KRAFT_HOME:-$HOME\u002F.kraft}\u002Frun}\"\npython3 -c \"import sqlite3, sys; print(sqlite3.connect('file:' + sys.argv[1] + '?mode=ro', uri=True).execute('PRAGMA user_version').fetchone()[0])\" \"$run\u002Forchestrator.db\"\n",[514,966,967,1001],{"__ignoreMap":640},[644,968,969,971,973,975,977,979,981,983,985,987,989,991,993,995,997,999],{"class":646,"line":647},[644,970,600],{"class":650},[644,972,654],{"class":653},[644,974,900],{"class":657},[644,976,903],{"class":650},[644,978,906],{"class":653},[644,980,909],{"class":657},[644,982,912],{"class":650},[644,984,906],{"class":653},[644,986,661],{"class":650},[644,988,919],{"class":653},[644,990,567],{"class":657},[644,992,846],{"class":650},[644,994,926],{"class":657},[644,996,919],{"class":653},[644,998,600],{"class":650},[644,1000,933],{"class":657},[644,1002,1003,1005,1007,1009,1011,1013],{"class":646,"line":667},[644,1004,724],{"class":670},[644,1006,727],{"class":673},[644,1008,730],{"class":657},[644,1010,677],{"class":657},[644,1012,944],{"class":650},[644,1014,1015],{"class":657},"\u002Forchestrator.db\"\n",[622,1017],{},"If it prints another number, the restore put in a copy 1.4 refuses: repeat\nsteps 1 and 4 with a copy that prints 44. If it prints an error, no database is\nin place: read the message the restore block printed, and run it again. A restore\nfrom the wrong copy also makes 1.4 refuse to start\n(",[514,1020,1021],{},"database schema vN is newer than code vM"," in ",[514,1024,1025],{},"run\u002Flogs\u002Fserver.log",").",[531,1028,1029,1030,1033,1034,1036,1037,1039,1040,1043,1044,1046,1047,1090],{},"Check the config directory. 1.4 reads ",[514,1031,1032],{},"templates"," under ",[514,1035,584],{},", which is\n",[514,1038,606],{}," unless you set it. 2.0's first start renamed it to ",[514,1041,1042],{},"config"," and\nleft ",[514,1045,1032],{}," as a link to it, which 1.4 follows. Run:",[635,1048,1050],{"className":637,"code":1049,"language":639,"meta":640,"style":640},"home=\"${KRAFT_HOME:-$HOME\u002F.kraft}\"\nls -ld \"$home\u002Ftemplates\"\n",[514,1051,1052,1074],{"__ignoreMap":640},[644,1053,1054,1056,1058,1060,1062,1064,1066,1068,1070,1072],{"class":646,"line":647},[644,1055,596],{"class":650},[644,1057,654],{"class":653},[644,1059,900],{"class":657},[644,1061,912],{"class":650},[644,1063,906],{"class":653},[644,1065,661],{"class":650},[644,1067,919],{"class":653},[644,1069,567],{"class":657},[644,1071,846],{"class":650},[644,1073,933],{"class":657},[644,1075,1076,1079,1082,1084,1087],{"class":646,"line":667},[644,1077,1078],{"class":670},"ls",[644,1080,1081],{"class":673}," -ld",[644,1083,677],{"class":657},[644,1085,1086],{"class":650},"$home",[644,1088,1089],{"class":657},"\u002Ftemplates\"\n",[528,1091,1092,1099,1241,1506],{},[531,1093,1094,1095,1098],{},"If it prints a link (",[514,1096,1097],{},"templates -> config","), there is nothing to do: go to\nstep 6.",[531,1100,1101,1102,1105,1106,1109,1110,1114,1115,1117,1118,1120,1121,1124,1125,1128,1129],{},"If it prints ",[514,1103,1104],{},"No such file or directory",", the link is gone: rename the\ndirectory back. When 1.4 finds no ",[514,1107,1108],{},"templates\u002F",", it seeds a fresh default\nhome beside yours, with no repos, a default ",[535,1111,1113],{"href":1112},"\u002Fconcepts\u002Fvocabulary#policy","policy"," and no ",[514,1116,322],{},".\nThe block moves nothing if ",[514,1119,1032],{}," exists, because ",[514,1122,1123],{},"mv"," would put\n",[514,1126,1127],{},"config\u002F"," inside it:",[635,1130,1132],{"className":637,"code":1131,"language":639,"meta":640,"style":640},"home=\"${KRAFT_HOME:-$HOME\u002F.kraft}\"\nif [ -e \"$home\u002Ftemplates\" ] || [ -L \"$home\u002Ftemplates\" ]; then\n  echo \"$home\u002Ftemplates exists: nothing moved\"\nelse\n  mv \"$home\u002Fconfig\" \"$home\u002Ftemplates\"\nfi\n",[514,1133,1134,1156,1197,1210,1216,1235],{"__ignoreMap":640},[644,1135,1136,1138,1140,1142,1144,1146,1148,1150,1152,1154],{"class":646,"line":647},[644,1137,596],{"class":650},[644,1139,654],{"class":653},[644,1141,900],{"class":657},[644,1143,912],{"class":650},[644,1145,906],{"class":653},[644,1147,661],{"class":650},[644,1149,919],{"class":653},[644,1151,567],{"class":657},[644,1153,846],{"class":650},[644,1155,933],{"class":657},[644,1157,1158,1161,1164,1167,1169,1171,1174,1177,1180,1182,1185,1187,1189,1191,1194],{"class":646,"line":667},[644,1159,1160],{"class":653},"if",[644,1162,1163],{"class":650}," [ ",[644,1165,1166],{"class":653},"-e",[644,1168,677],{"class":657},[644,1170,1086],{"class":650},[644,1172,1173],{"class":657},"\u002Ftemplates\"",[644,1175,1176],{"class":650}," ] ",[644,1178,1179],{"class":653},"||",[644,1181,1163],{"class":650},[644,1183,1184],{"class":653},"-L",[644,1186,677],{"class":657},[644,1188,1086],{"class":650},[644,1190,1173],{"class":657},[644,1192,1193],{"class":650}," ]; ",[644,1195,1196],{"class":653},"then\n",[644,1198,1200,1203,1205,1207],{"class":646,"line":1199},3,[644,1201,1202],{"class":673},"  echo",[644,1204,677],{"class":657},[644,1206,1086],{"class":650},[644,1208,1209],{"class":657},"\u002Ftemplates exists: nothing moved\"\n",[644,1211,1213],{"class":646,"line":1212},4,[644,1214,1215],{"class":653},"else\n",[644,1217,1219,1222,1224,1226,1229,1231,1233],{"class":646,"line":1218},5,[644,1220,1221],{"class":670},"  mv",[644,1223,677],{"class":657},[644,1225,1086],{"class":650},[644,1227,1228],{"class":657},"\u002Fconfig\"",[644,1230,677],{"class":657},[644,1232,1086],{"class":650},[644,1234,1089],{"class":657},[644,1236,1238],{"class":646,"line":1237},6,[644,1239,1240],{"class":653},"fi\n",[531,1242,1243,1244,1247,1248,1250,1251,1254,1255,1257,1258,1260,1261,1263,1264,1266,1267,1269,1270,1272,1273,1488,1490,1491,1493,1494,1497,1498,1500,1501,1505],{},"If it prints a directory (",[514,1245,1246],{},"drwx...",", no arrow), not a link, 2.0 found a ",[514,1249,1127],{}," you had made\nand could not merge the two (",[514,1252,1253],{},"kraft admin doctor","'s ",[514,1256,1042],{}," row named both).\nMove what ",[514,1259,1108],{}," still holds into ",[514,1262,1127],{},", keeping the copy you want\nof each. Then set ",[514,1265,1108],{}," aside under a dated name and put a link in its\nplace. The block moves nothing unless ",[514,1268,1032],{}," is a real folder, not a\nlink, and ",[514,1271,1042],{}," is a folder:",[635,1274,1276],{"className":637,"code":1275,"language":639,"meta":640,"style":640},"home=\"${KRAFT_HOME:-$HOME\u002F.kraft}\"\nold=\"$home\u002Ftemplates.old-$(date +%Y%m%d-%H%M%S)\"\nif [ -L \"$home\u002Ftemplates\" ] || [ ! -d \"$home\u002Ftemplates\" ]; then\n  echo \"$home\u002Ftemplates is not a real folder: nothing moved\"\nelif [ ! -d \"$home\u002Fconfig\" ]; then\n  echo \"$home\u002Fconfig is not a folder: nothing moved\"\nelif [ -e \"$old\" ]; then\n  echo \"$old is already there: run this again\"\nelse\n  mv \"$home\u002Ftemplates\" \"$old\" && ln -s config \"$home\u002Ftemplates\" && ls -ld \"$home\u002Ftemplates\"\nfi\n",[514,1277,1278,1300,1320,1356,1367,1388,1399,1419,1431,1436,1483],{"__ignoreMap":640},[644,1279,1280,1282,1284,1286,1288,1290,1292,1294,1296,1298],{"class":646,"line":647},[644,1281,596],{"class":650},[644,1283,654],{"class":653},[644,1285,900],{"class":657},[644,1287,912],{"class":650},[644,1289,906],{"class":653},[644,1291,661],{"class":650},[644,1293,919],{"class":653},[644,1295,567],{"class":657},[644,1297,846],{"class":650},[644,1299,933],{"class":657},[644,1301,1302,1305,1307,1309,1311,1314,1317],{"class":646,"line":667},[644,1303,1304],{"class":650},"old",[644,1306,654],{"class":653},[644,1308,658],{"class":657},[644,1310,1086],{"class":650},[644,1312,1313],{"class":657},"\u002Ftemplates.old-$(",[644,1315,1316],{"class":670},"date",[644,1318,1319],{"class":657}," +%Y%m%d-%H%M%S)\"\n",[644,1321,1322,1324,1326,1328,1330,1332,1334,1336,1338,1340,1343,1346,1348,1350,1352,1354],{"class":646,"line":1199},[644,1323,1160],{"class":653},[644,1325,1163],{"class":650},[644,1327,1184],{"class":653},[644,1329,677],{"class":657},[644,1331,1086],{"class":650},[644,1333,1173],{"class":657},[644,1335,1176],{"class":650},[644,1337,1179],{"class":653},[644,1339,1163],{"class":650},[644,1341,1342],{"class":653},"!",[644,1344,1345],{"class":653}," -d",[644,1347,677],{"class":657},[644,1349,1086],{"class":650},[644,1351,1173],{"class":657},[644,1353,1193],{"class":650},[644,1355,1196],{"class":653},[644,1357,1358,1360,1362,1364],{"class":646,"line":1212},[644,1359,1202],{"class":673},[644,1361,677],{"class":657},[644,1363,1086],{"class":650},[644,1365,1366],{"class":657},"\u002Ftemplates is not a real folder: nothing moved\"\n",[644,1368,1369,1372,1374,1376,1378,1380,1382,1384,1386],{"class":646,"line":1218},[644,1370,1371],{"class":653},"elif",[644,1373,1163],{"class":650},[644,1375,1342],{"class":653},[644,1377,1345],{"class":653},[644,1379,677],{"class":657},[644,1381,1086],{"class":650},[644,1383,1228],{"class":657},[644,1385,1193],{"class":650},[644,1387,1196],{"class":653},[644,1389,1390,1392,1394,1396],{"class":646,"line":1237},[644,1391,1202],{"class":673},[644,1393,677],{"class":657},[644,1395,1086],{"class":650},[644,1397,1398],{"class":657},"\u002Fconfig is not a folder: nothing moved\"\n",[644,1400,1402,1404,1406,1408,1410,1413,1415,1417],{"class":646,"line":1401},7,[644,1403,1371],{"class":653},[644,1405,1163],{"class":650},[644,1407,1166],{"class":653},[644,1409,677],{"class":657},[644,1411,1412],{"class":650},"$old",[644,1414,658],{"class":657},[644,1416,1193],{"class":650},[644,1418,1196],{"class":653},[644,1420,1422,1424,1426,1428],{"class":646,"line":1421},8,[644,1423,1202],{"class":673},[644,1425,677],{"class":657},[644,1427,1412],{"class":650},[644,1429,1430],{"class":657}," is already there: run this again\"\n",[644,1432,1434],{"class":646,"line":1433},9,[644,1435,1215],{"class":653},[644,1437,1439,1441,1443,1445,1447,1449,1451,1453,1456,1459,1462,1465,1467,1469,1471,1473,1475,1477,1479,1481],{"class":646,"line":1438},10,[644,1440,1221],{"class":670},[644,1442,677],{"class":657},[644,1444,1086],{"class":650},[644,1446,1173],{"class":657},[644,1448,677],{"class":657},[644,1450,1412],{"class":650},[644,1452,658],{"class":657},[644,1454,1455],{"class":650}," && ",[644,1457,1458],{"class":670},"ln",[644,1460,1461],{"class":673}," -s",[644,1463,1464],{"class":657}," config",[644,1466,677],{"class":657},[644,1468,1086],{"class":650},[644,1470,1173],{"class":657},[644,1472,1455],{"class":650},[644,1474,1078],{"class":670},[644,1476,1081],{"class":673},[644,1478,677],{"class":657},[644,1480,1086],{"class":650},[644,1482,1089],{"class":657},[644,1484,1486],{"class":646,"line":1485},11,[644,1487,1240],{"class":653},[622,1489],{},"The last command prints the new link, ",[514,1492,1097],{},". Nothing is\ndeleted: ",[514,1495,1496],{},"templates.old-\u003Ctime>"," holds whatever you did not move into\n",[514,1499,1127],{},". Delete that folder once 1.4 runs and\n",[535,1502,1504],{"href":1503},"#check-it-worked","Check it worked"," passes, and not before.",[531,1507,1508,1509,1512,1513,1516],{},"If you pointed ",[514,1510,1511],{},"KRAFT_CONFIG_DIR"," at another directory, 2.0 never renamed\nit. Point 1.4's ",[514,1514,1515],{},"KRAFT_TEMPLATES_DIR"," at it instead.",[531,1518,1519,1520,1523,1524,1527,1528,1530,1531,1534,1535,1538,1539,1542,1543,1546,1547,1550,1551,1538,1554,1557,1558,567],{},"Write each schedule's ",[514,1521,1522],{},"cron"," field the way 1.4 reads it, in the ",[514,1525,1526],{},"schedules:","\nlist of ",[514,1529,326],{},", before you move it. 1.4 reads only ",[514,1532,1533],{},"*"," or a comma list\nof numbers. Write a range or a step as that list (",[514,1536,1537],{},"1-5"," as ",[514,1540,1541],{},"1,2,3,4,5",", ",[514,1544,1545],{},"*\u002F15","\nas ",[514,1548,1549],{},"0,15,30,45",") and a day of week ",[514,1552,1553],{},"7",[514,1555,1556],{},"0",". If you skip this, see ",[535,1559,589],{"href":588},[531,1561,1562,1563,1565,1566,1569,1570,1572,1573,1022,1575,1577,1578,1580,1581,1583,1584,567,1586,1588,1589,1593,1594,1597,1598,1600,1601,567],{},"Move the schedules to ",[514,1564,310],{},". 1.4 reads them as ",[514,1567,1568],{},"triggers:"," in\n",[514,1571,310],{},", not as ",[514,1574,1526],{},[514,1576,326],{},". The entries have the same\nshape, so cut the list from ",[514,1579,326],{}," and paste it under a ",[514,1582,1568],{}," key\nin ",[514,1585,310],{},[622,1587],{},"Add the key yourself: 2.0 removed it once every ",[535,1590,1592],{"href":1591},"\u002Fconcepts\u002Fvocabulary#trigger","trigger"," had moved, and the\n",[514,1595,1596],{},"# triggers:"," in a seeded file is a commented example, so pasting under that\nline breaks the file. If some triggers stayed in ",[514,1599,310],{},", paste under\nthe key that is there. If you skip this, see ",[535,1602,589],{"href":588},[531,1604,1605,1606,1608,1609,1611,1612,1615,1616,1618,1619,1623,1624,567],{},"Delete the ",[514,1607,1526],{}," key itself from ",[514,1610,326],{},", even an empty\n",[514,1613,1614],{},"schedules: []",", because 1.4 refuses an ",[514,1617,326],{}," that has one. If you skip this, ",[535,1620,1622],{"href":1621},"\u002Fconcepts\u002Fvocabulary#auto-intake","auto-intake"," stays off: see ",[535,1625,589],{"href":588},[531,1627,1628,1629,610,1632,1634,1635,1022,1638,1640,1641,567],{},"Delete ",[514,1630,1631],{},"forge_poll_s",[514,1633,310],{},", if you set it, because 1.4 rejects\nthe file with it. ",[514,1636,1637],{},"max_concurrent",[514,1639,310],{}," needs nothing: 1.4 reads it\nthere. If you skip this, see ",[535,1642,589],{"href":588},[531,1644,1645,1646,1648,1649,1652,1653,1656,1657,1660,1661,567,1664,1666,1667,1669,1670,1672,1673,1675,1676,567],{},"Rename the chain key in ",[514,1647,292],{},". 1.4 reads a repo's chain only as\n",[514,1650,1651],{},"default_chain_template"," and skips ",[514,1654,1655],{},"default_chain",". Rename each\n",[514,1658,1659],{},"default_chain:"," to ",[514,1662,1663],{},"default_chain_template:",[622,1665],{},"Where an entry has both keys (2.0 can save the new one beside the old), put\n",[514,1668,1655],{},"'s value, the one 2.0 used, in ",[514,1671,1651],{},", then\ndelete the ",[514,1674,1655],{}," line, so no entry ends with both. If you skip this, see ",[535,1677,589],{"href":588},[531,1679,1680,1681,1022,1685,1687,1688,1691,1692,1695,1696,1699,1700,1828,1830,1831,1833,1834,1836,1837,567],{},"Rewrite the ",[535,1682,1684],{"href":1683},"\u002Fconcepts\u002Fvocabulary#agent-profile","agent profiles",[514,1686,318],{},". An agent profile saved on 2.0's\nSettings › Harnesses is written as ",[514,1689,1690],{},"providers:",", which 1.4 refuses, and with\nit the whole file. Rewrite each such agent profile in 1.4's shape, one ",[514,1693,1694],{},"model:"," map\nby provider and one ",[514,1697,1698],{},"effort:"," for all of them:",[635,1701,1705],{"className":1702,"code":1703,"language":1704,"meta":640,"style":640},"language-yaml shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","# 2.0\nstrong:\n  providers:\n    claude: { model: sonnet, effort: high }\n    codex: { model: gpt-5.6-terra, effort: high }\n# 1.4\nstrong:\n  model: { claude: sonnet, codex: gpt-5.6-terra }\n  effort: high\n","yaml",[514,1706,1707,1713,1721,1728,1758,1782,1787,1793,1818],{"__ignoreMap":640},[644,1708,1709],{"class":646,"line":647},[644,1710,1712],{"class":1711},"sq92B","# 2.0\n",[644,1714,1715,1718],{"class":646,"line":667},[644,1716,830],{"class":1717},"sb7M8",[644,1719,1720],{"class":650},":\n",[644,1722,1723,1726],{"class":646,"line":1199},[644,1724,1725],{"class":1717},"  providers",[644,1727,1720],{"class":650},[644,1729,1730,1733,1736,1739,1742,1745,1747,1750,1752,1755],{"class":646,"line":1212},[644,1731,1732],{"class":1717},"    claude",[644,1734,1735],{"class":650},": { ",[644,1737,1738],{"class":1717},"model",[644,1740,1741],{"class":650},": ",[644,1743,1744],{"class":657},"sonnet",[644,1746,1542],{"class":650},[644,1748,1749],{"class":1717},"effort",[644,1751,1741],{"class":650},[644,1753,1754],{"class":657},"high",[644,1756,1757],{"class":650}," }\n",[644,1759,1760,1763,1765,1767,1769,1772,1774,1776,1778,1780],{"class":646,"line":1218},[644,1761,1762],{"class":1717},"    codex",[644,1764,1735],{"class":650},[644,1766,1738],{"class":1717},[644,1768,1741],{"class":650},[644,1770,1771],{"class":657},"gpt-5.6-terra",[644,1773,1542],{"class":650},[644,1775,1749],{"class":1717},[644,1777,1741],{"class":650},[644,1779,1754],{"class":657},[644,1781,1757],{"class":650},[644,1783,1784],{"class":646,"line":1237},[644,1785,1786],{"class":1711},"# 1.4\n",[644,1788,1789,1791],{"class":646,"line":1401},[644,1790,830],{"class":1717},[644,1792,1720],{"class":650},[644,1794,1795,1798,1800,1803,1805,1807,1809,1812,1814,1816],{"class":646,"line":1421},[644,1796,1797],{"class":1717},"  model",[644,1799,1735],{"class":650},[644,1801,1802],{"class":1717},"claude",[644,1804,1741],{"class":650},[644,1806,1744],{"class":657},[644,1808,1542],{"class":650},[644,1810,1811],{"class":1717},"codex",[644,1813,1741],{"class":650},[644,1815,1771],{"class":657},[644,1817,1757],{"class":650},[644,1819,1820,1823,1825],{"class":646,"line":1433},[644,1821,1822],{"class":1717},"  effort",[644,1824,1741],{"class":650},[644,1826,1827],{"class":657},"high\n",[622,1829],{},"1.4 has one ",[514,1832,1749],{}," per agent profile: where the providers set different ones,\npick one. An agent profile already in the ",[514,1835,1694],{}," shape needs nothing. If you skip this,\nsee ",[535,1838,589],{"href":588},[531,1840,1841,1842,1845,1846,1848,1849,1853,1854,567,1857,1859,1860,1862,1863,1866,1867,1870,1871,2091,2093,2094,2096,2097,2100,2101,2104,2105,2108,2109,567],{},"Restore the theme. 1.4's interface takes its colors from ",[514,1843,1844],{},"palette",", which 2.0\nremoved, so without the copy it shows its default colors. Copy the file 2.0\nkept over ",[514,1847,334],{},". If a 1.5.0 release candidate converted the theme first,\nuse the candidate's file, named in\n",[535,1850,1852],{"href":1851},"\u002Fguides\u002Frun\u002Fupgrade-from-1-4#your-theme","Your theme",", in place of\n",[514,1855,1856],{},"theme.yaml.pre-2.0",[622,1858],{},"The copy is your theme from the first upgrade past 1.4, and is never\nreplaced. The block first moves the current ",[514,1861,334],{}," aside as\n",[514,1864,1865],{},"theme.yaml.before-rollback-\u003Ctime>",", so a theme you changed on 1.4 earlier is\nkept there, and copies over only when the source file exists. Put the\ncandidate's file in ",[514,1868,1869],{},"copy"," if one converted the theme. Delete the dated file\nonce 1.4 shows the theme you want, and not before:",[635,1872,1874],{"className":637,"code":1873,"language":639,"meta":640,"style":640},"home=\"${KRAFT_HOME:-$HOME\u002F.kraft}\"\ncopy=\"$home\u002Ftemplates\u002Ftheme.yaml.pre-2.0\"\nsaved=\"$home\u002Ftemplates\u002Ftheme.yaml.before-rollback-$(date +%Y%m%d-%H%M%S)\"\nif [ ! -f \"$copy\" ]; then\n  echo \"$copy is not a file: nothing changed. Set copy to the right file, or edit theme.yaml by hand\"\nelif [ -e \"$saved\" ]; then\n  echo \"$saved is already there: run this again\"\nelif [ -e \"$home\u002Ftemplates\u002Ftheme.yaml\" ] && ! mv \"$home\u002Ftemplates\u002Ftheme.yaml\" \"$saved\"; then\n  echo \"could not move theme.yaml aside: nothing changed\"\nelse\n  cp \"$copy\" \"$home\u002Ftemplates\u002Ftheme.yaml\" && ls -l \"$home\u002Ftemplates\u002Ftheme.yaml\" || echo \"the copy failed: the theme you had is at $saved, if there was one\"\nfi\n",[514,1875,1876,1898,1911,1929,1951,1962,1981,1991,2031,2038,2042,2086],{"__ignoreMap":640},[644,1877,1878,1880,1882,1884,1886,1888,1890,1892,1894,1896],{"class":646,"line":647},[644,1879,596],{"class":650},[644,1881,654],{"class":653},[644,1883,900],{"class":657},[644,1885,912],{"class":650},[644,1887,906],{"class":653},[644,1889,661],{"class":650},[644,1891,919],{"class":653},[644,1893,567],{"class":657},[644,1895,846],{"class":650},[644,1897,933],{"class":657},[644,1899,1900,1902,1904,1906,1908],{"class":646,"line":667},[644,1901,1869],{"class":650},[644,1903,654],{"class":653},[644,1905,658],{"class":657},[644,1907,1086],{"class":650},[644,1909,1910],{"class":657},"\u002Ftemplates\u002Ftheme.yaml.pre-2.0\"\n",[644,1912,1913,1916,1918,1920,1922,1925,1927],{"class":646,"line":1199},[644,1914,1915],{"class":650},"saved",[644,1917,654],{"class":653},[644,1919,658],{"class":657},[644,1921,1086],{"class":650},[644,1923,1924],{"class":657},"\u002Ftemplates\u002Ftheme.yaml.before-rollback-$(",[644,1926,1316],{"class":670},[644,1928,1319],{"class":657},[644,1930,1931,1933,1935,1937,1940,1942,1945,1947,1949],{"class":646,"line":1212},[644,1932,1160],{"class":653},[644,1934,1163],{"class":650},[644,1936,1342],{"class":653},[644,1938,1939],{"class":653}," -f",[644,1941,677],{"class":657},[644,1943,1944],{"class":650},"$copy",[644,1946,658],{"class":657},[644,1948,1193],{"class":650},[644,1950,1196],{"class":653},[644,1952,1953,1955,1957,1959],{"class":646,"line":1218},[644,1954,1202],{"class":673},[644,1956,677],{"class":657},[644,1958,1944],{"class":650},[644,1960,1961],{"class":657}," is not a file: nothing changed. Set copy to the right file, or edit theme.yaml by hand\"\n",[644,1963,1964,1966,1968,1970,1972,1975,1977,1979],{"class":646,"line":1237},[644,1965,1371],{"class":653},[644,1967,1163],{"class":650},[644,1969,1166],{"class":653},[644,1971,677],{"class":657},[644,1973,1974],{"class":650},"$saved",[644,1976,658],{"class":657},[644,1978,1193],{"class":650},[644,1980,1196],{"class":653},[644,1982,1983,1985,1987,1989],{"class":646,"line":1401},[644,1984,1202],{"class":673},[644,1986,677],{"class":657},[644,1988,1974],{"class":650},[644,1990,1430],{"class":657},[644,1992,1993,1995,1997,1999,2001,2003,2006,2009,2011,2014,2016,2018,2020,2022,2024,2026,2029],{"class":646,"line":1421},[644,1994,1371],{"class":653},[644,1996,1163],{"class":650},[644,1998,1166],{"class":653},[644,2000,677],{"class":657},[644,2002,1086],{"class":650},[644,2004,2005],{"class":657},"\u002Ftemplates\u002Ftheme.yaml\"",[644,2007,2008],{"class":650}," ] && ",[644,2010,1342],{"class":653},[644,2012,2013],{"class":670}," mv",[644,2015,677],{"class":657},[644,2017,1086],{"class":650},[644,2019,2005],{"class":657},[644,2021,677],{"class":657},[644,2023,1974],{"class":650},[644,2025,658],{"class":657},[644,2027,2028],{"class":650},"; ",[644,2030,1196],{"class":653},[644,2032,2033,2035],{"class":646,"line":1433},[644,2034,1202],{"class":673},[644,2036,2037],{"class":657}," \"could not move theme.yaml aside: nothing changed\"\n",[644,2039,2040],{"class":646,"line":1438},[644,2041,1215],{"class":653},[644,2043,2044,2047,2049,2051,2053,2055,2057,2059,2061,2063,2066,2068,2070,2072,2075,2078,2081,2083],{"class":646,"line":1485},[644,2045,2046],{"class":670},"  cp",[644,2048,677],{"class":657},[644,2050,1944],{"class":650},[644,2052,658],{"class":657},[644,2054,677],{"class":657},[644,2056,1086],{"class":650},[644,2058,2005],{"class":657},[644,2060,1455],{"class":650},[644,2062,1078],{"class":670},[644,2064,2065],{"class":673}," -l",[644,2067,677],{"class":657},[644,2069,1086],{"class":650},[644,2071,2005],{"class":657},[644,2073,2074],{"class":653}," ||",[644,2076,2077],{"class":673}," echo",[644,2079,2080],{"class":657}," \"the copy failed: the theme you had is at ",[644,2082,1974],{"class":650},[644,2084,2085],{"class":657},", if there was one\"\n",[644,2087,2089],{"class":646,"line":2088},12,[644,2090,1240],{"class":653},[622,2092],{},"With no copy, open ",[514,2095,334],{}," and look for ",[514,2098,2099],{},"group_by: chain",", which 2.0\nwrites when the board is grouped by chain, and change it to\n",[514,2102,2103],{},"group_by: template",". Also look for an ",[514,2106,2107],{},"editor:"," line, which 2.0 writes when\nyou pick a Default editor in Settings › Appearance, and delete it. Or delete\nthe file. 1.4 refuses both, and its board then loads no theme: see\n",[535,2110,589],{"href":588},[531,2112,2113,2114,2117,2118,2121,2122,567],{},"Start Kraft with ",[514,2115,2116],{},"kraft admin start --detach",", or with\n",[514,2119,2120],{},"kraft admin install-service"," if it ran as a service. If 1.4 does not start, see\n",[535,2123,589],{"href":588},[523,2125,1504],{"id":2126},"check-it-worked",[510,2128,2129],{},"Run:",[635,2131,2132],{"className":637,"code":839,"language":639,"meta":640,"style":640},[514,2133,2134],{"__ignoreMap":640},[644,2135,2136,2138],{"class":646,"line":647},[644,2137,846],{"class":670},[644,2139,849],{"class":673},[635,2141,2143],{"className":2142,"code":853,"language":691,"meta":640},[689],[514,2144,2145],{"__ignoreMap":640},[644,2146,853],{"className":2147},[646],[510,2149,2150,2151,2154,2155,567],{},"Then run ",[514,2152,2153],{},"kraft admin templates lint"," and ",[514,2156,1253],{},[510,2158,2159,2160,517,2163,2165,2166,2169,2170,2173,2174,2176,2177,2180],{},"You know it worked when ",[514,2161,2162],{},"--version",[514,2164,520],{},", the board loads,\n",[514,2167,2168],{},"templates lint"," exits 0, and ",[514,2171,2172],{},"doctor"," shows no failing ",[514,2175,1032],{}," row (1.4's\nname for the config directory row) or ",[514,2178,2179],{},"keys"," row.",[510,2182,2183,2184,567],{},"If one of them fails, or the board misbehaves, find what you see in\n",[535,2185,589],{"href":588},[523,2187,589],{"id":2188},"if-14-will-not-start-or-misbehaves",[2190,2191,2192,2208],"table",{},[2193,2194,2195],"thead",{},[2196,2197,2198,2202,2205],"tr",{},[2199,2200,2201],"th",{},"What you see",[2199,2203,2204],{},"Why",[2199,2206,2207],{},"What to do",[2209,2210,2211,2226,2257,2277,2300,2322,2337,2363],"tbody",{},[2196,2212,2213,2220,2223],{},[2214,2215,2216,1022,2218],"td",{},[514,2217,1021],{},[514,2219,1025],{},[2214,2221,2222],{},"The database is not the one 1.4 left: a newer Kraft migrated it.",[2214,2224,2225],{},"Restore a copy that prints 44: steps 1 and 4.",[2196,2227,2228,2237,2254],{},[2214,2229,2230,2231,2233,2234],{},"Every new item is refused. For ",[514,2232,1631],{},", the log says ",[514,2235,2236],{},"policy config invalid, refusing work",[2214,2238,2239,2241,2242,2244,2245,2247,2248,2250,2251,2253],{},[514,2240,310],{}," has what 1.4 rejects: ",[514,2243,1631],{},", a ",[514,2246,1522],{}," range or step, or a ",[514,2249,1568],{}," pasted under the commented ",[514,2252,1596],{}," line.",[2214,2255,2256],{},"Steps 6, 7 and 9.",[2196,2258,2259,2266,2274],{},[2214,2260,2261,2262,2265],{},"Auto-intake stays off while ",[514,2263,2264],{},"kraft admin health"," says ok",[2214,2267,2268,2270,2271,2273],{},[514,2269,326],{}," still has a ",[514,2272,1526],{}," key.",[2214,2275,2276],{},"Step 8.",[2196,2278,2279,2288,2294],{},[2214,2280,2281,2282,2284,2285,2287],{},"A ",[514,2283,1522],{}," with day of week ",[514,2286,1553],{}," never fires",[2214,2289,2290,2291,2293],{},"1.4 loads ",[514,2292,1553],{}," and never fires it.",[2214,2295,2296,2297,2299],{},"Write it as ",[514,2298,1556],{},": step 6.",[2196,2301,2302,2311,2319],{},[2214,2303,2304,2305,2307,2308],{},"Doctor's ",[514,2306,2179],{}," row fails, and the repo files on ",[514,2309,2310],{},"default",[2214,2312,2313,2315,2316,2318],{},[514,2314,292],{}," has ",[514,2317,1655],{},", which 1.4 skips.",[2214,2320,2321],{},"Step 10.",[2196,2323,2324,2329,2334],{},[2214,2325,2326,2328],{},[514,2327,318],{}," is refused as a whole",[2214,2330,2331,2332,567],{},"An agent profile is written as ",[514,2333,1690],{},[2214,2335,2336],{},"Step 11.",[2196,2338,2339,2342,2360],{},[2214,2340,2341],{},"The board shows default colors, or loads no theme",[2214,2343,2344,2315,2346,1542,2349,2154,2352,1542,2355,2357,2358,2253],{},[514,2345,334],{},[514,2347,2348],{},"surface",[514,2350,2351],{},"accent",[514,2353,2354],{},"colour_amount",[514,2356,2099],{},", or an ",[514,2359,2107],{},[2214,2361,2362],{},"Step 12.",[2196,2364,2365,2368,2373],{},[2214,2366,2367],{},"A fresh default home appears beside yours, with no repos",[2214,2369,2370,2371,567],{},"1.4 found no ",[514,2372,1108],{},[2214,2374,2375],{},"Step 5.",[523,2377,2379],{"id":2378},"what-the-restore-leaves-behind","What the restore leaves behind",[510,2381,2382,2383,2386],{},"Restoring the backup loses everything done on 2.0 since you took it: items filed,\nruns, approvals and their history. It does not remove what those runs made\noutside the database. Their worktrees under ",[514,2384,2385],{},"run\u002Fworktrees\u002F",", their branches, and\nany merge requests they opened are still there, and 1.4 knows nothing about them.",[528,2388,2389,2397],{},[531,2390,2391,1254,2393,2396],{},[514,2392,1253],{},[514,2394,2395],{},"worktrees"," row lists a worktree with no work item.\nDelete the ones you do not need, and close any merge request yourself. 1.4's\nrow also lists the worktrees of items you cancelled on 1.4, which its board does\nnot show.",[531,2398,2399,2400,2403,2404,2458,699,2460,2462,2463],{},"A worktree made on 2.0 is one whose id is not in the database you restored.\nThis lists the ids that are. ",[514,2401,2402],{},"-readonly"," makes a wrong path an error, not an\nempty database where Kraft is about to start:",[635,2405,2407],{"className":637,"code":2406,"language":639,"meta":640,"style":640},"run=\"${KRAFT_RUN_DIR:-${KRAFT_HOME:-$HOME\u002F.kraft}\u002Frun}\"\nsqlite3 -readonly \"$run\u002Forchestrator.db\" \"select id from work_items\"\n",[514,2408,2409,2443],{"__ignoreMap":640},[644,2410,2411,2413,2415,2417,2419,2421,2423,2425,2427,2429,2431,2433,2435,2437,2439,2441],{"class":646,"line":647},[644,2412,600],{"class":650},[644,2414,654],{"class":653},[644,2416,900],{"class":657},[644,2418,903],{"class":650},[644,2420,906],{"class":653},[644,2422,909],{"class":657},[644,2424,912],{"class":650},[644,2426,906],{"class":653},[644,2428,661],{"class":650},[644,2430,919],{"class":653},[644,2432,567],{"class":657},[644,2434,846],{"class":650},[644,2436,926],{"class":657},[644,2438,919],{"class":653},[644,2440,600],{"class":650},[644,2442,933],{"class":657},[644,2444,2445,2447,2449,2451,2453,2455],{"class":646,"line":667},[644,2446,555],{"class":670},[644,2448,674],{"class":673},[644,2450,677],{"class":657},[644,2452,944],{"class":650},[644,2454,947],{"class":657},[644,2456,2457],{"class":657}," \"select id from work_items\"\n",[622,2459],{},[514,2461,555],{}," command:",[635,2464,2466],{"className":637,"code":2465,"language":639,"meta":640,"style":640},"run=\"${KRAFT_RUN_DIR:-${KRAFT_HOME:-$HOME\u002F.kraft}\u002Frun}\"\npython3 -c \"import sqlite3, sys; [print(r[0]) for r in sqlite3.connect('file:' + sys.argv[1] + '?mode=ro', uri=True).execute('select id from work_items')]\" \"$run\u002Forchestrator.db\"\n",[514,2467,2468,2502],{"__ignoreMap":640},[644,2469,2470,2472,2474,2476,2478,2480,2482,2484,2486,2488,2490,2492,2494,2496,2498,2500],{"class":646,"line":647},[644,2471,600],{"class":650},[644,2473,654],{"class":653},[644,2475,900],{"class":657},[644,2477,903],{"class":650},[644,2479,906],{"class":653},[644,2481,909],{"class":657},[644,2483,912],{"class":650},[644,2485,906],{"class":653},[644,2487,661],{"class":650},[644,2489,919],{"class":653},[644,2491,567],{"class":657},[644,2493,846],{"class":650},[644,2495,926],{"class":657},[644,2497,919],{"class":653},[644,2499,600],{"class":650},[644,2501,933],{"class":657},[644,2503,2504,2506,2508,2511,2513,2515],{"class":646,"line":667},[644,2505,724],{"class":670},[644,2507,727],{"class":673},[644,2509,2510],{"class":657}," \"import sqlite3, sys; [print(r[0]) for r in sqlite3.connect('file:' + sys.argv[1] + '?mode=ro', uri=True).execute('select id from work_items')]\"",[644,2512,677],{"class":657},[644,2514,944],{"class":650},[644,2516,1015],{"class":657},[523,2518,581,2520],{"id":2519},"what-a-rollback-does-to-kraft_home",[514,2521,584],{},[510,2523,2524,2525,2528,2529,2531,2532,1026],{},"Starting a newer Kraft migrates ",[514,2526,2527],{},"run\u002Forchestrator.db"," forward in place, and\nthere is no downgrade migration. An older Kraft refuses to start on a database a\nnewer one migrated (",[514,2530,1021],{},", in\n",[514,2533,1025],{},[510,2535,2536,2537,2542,2543,2545,2546,2549],{},"So ",[535,2538,2539,2540],{"href":537},"back up ",[514,2541,2527],{},"\nbefore you upgrade, and restore that backup when you roll back. If you have\nnone, restore the copy Kraft made before migrating: see\n",[535,2544,628],{"href":627},".\n",[514,2547,2548],{},"run\u002Findex.db"," needs nothing: an older Kraft rebuilds a search index it cannot\nread.",[510,2551,2552,2553,2555],{},"A rollback does not undo what a newer version changed in the config directory.\nWhat 2.0 moved, you move back by hand, and ",[514,2554,2153],{}," after a\nrollback checks the older version still accepts the chains. The steps above do it\nfile by file:",[2190,2557,2558,2576],{},[2193,2559,2560],{},[2196,2561,2562,2567,2570,2573],{},[2199,2563,2564,2565],{},"In ",[514,2566,1127],{},[2199,2568,2569],{},"What 2.0 did",[2199,2571,2572],{},"What 1.4 needs",[2199,2574,2575],{},"Step",[2209,2577,2578,2601,2638,2655,2676],{},[2196,2579,2580,2583,2594,2598],{},[2214,2581,2582],{},"The directory",[2214,2584,2585,2586,1660,2588,2590,2591,2593],{},"Renamed ",[514,2587,1108],{},[514,2589,1127],{},", left a ",[514,2592,1032],{}," link",[2214,2595,2596],{},[514,2597,1108],{},[2214,2599,2600],{},"5",[2196,2602,2603,2609,2621,2635],{},[2214,2604,2605,2154,2607],{},[514,2606,326],{},[514,2608,310],{},[2214,2610,2611,2612,1022,2614,2028,2616,2618,2619],{},"Schedules moved to ",[514,2613,1526],{},[514,2615,326],{},[514,2617,1631],{}," may be set in ",[514,2620,310],{},[2214,2622,2623,1022,2625,1542,2627,2629,2630,2632,2633],{},[514,2624,1568],{},[514,2626,310],{},[514,2628,1522],{}," as numbers, no ",[514,2631,1526],{}," key, no ",[514,2634,1631],{},[2214,2636,2637],{},"6 to 9",[2196,2639,2640,2644,2648,2652],{},[2214,2641,2642],{},[514,2643,292],{},[2214,2645,2646],{},[514,2647,1655],{},[2214,2649,2650],{},[514,2651,1651],{},[2214,2653,2654],{},"10",[2196,2656,2657,2661,2666,2673],{},[2214,2658,2659],{},[514,2660,318],{},[2214,2662,2663,2664],{},"Agent profiles written as ",[514,2665,1690],{},[2214,2667,2281,2668,2670,2671],{},[514,2669,1694],{}," map and one ",[514,2672,1698],{},[2214,2674,2675],{},"11",[2196,2677,2678,2682,2696,2705],{},[2214,2679,2680],{},[514,2681,334],{},[2214,2683,2684,1542,2686,2154,2688,2028,2690,2692,2693,2695],{},[514,2685,2348],{},[514,2687,2351],{},[514,2689,2354],{},[514,2691,2099],{}," when the board is grouped by chain; an ",[514,2694,2107],{}," line when you pick a Default editor",[2214,2697,2698,1542,2700,1114,2702,2704],{},[514,2699,1844],{},[514,2701,2103],{},[514,2703,2107],{}," line",[2214,2706,2707],{},"12",[523,2709,2711],{"id":2710},"next-steps","Next steps",[528,2713,2714,2719,2724],{},[531,2715,2716,2718],{},[535,2717,152],{"href":153},": put the backup back, and find the copy Kraft made",[531,2720,2721,2723],{},[535,2722,160],{"href":161},": stop and start a service around the rollback",[531,2725,2726,2728],{},[535,2727,164],{"href":165},": pin a version, or upgrade again when you are ready",[2730,2731,2732],"style",{},"html pre.shiki code .s7iLA, html code.shiki .s7iLA{--shiki-light:#0E1116;--shiki-default:#0E1116;--shiki-dark:#F0F3F6}html pre.shiki code .sklAV, html code.shiki .sklAV{--shiki-light:#A0111F;--shiki-default:#A0111F;--shiki-dark:#FF9492}html pre.shiki code .semJd, html code.shiki .semJd{--shiki-light:#032563;--shiki-default:#032563;--shiki-dark:#ADDCFF}html pre.shiki code .szw1H, html code.shiki .szw1H{--shiki-light:#702C00;--shiki-default:#702C00;--shiki-dark:#FFB757}html pre.shiki code .ssYy9, html code.shiki .ssYy9{--shiki-light:#023B95;--shiki-default:#023B95;--shiki-dark:#91CBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sq92B, html code.shiki .sq92B{--shiki-light:#66707B;--shiki-default:#66707B;--shiki-dark:#BDC4CC}html pre.shiki code .sb7M8, html code.shiki .sb7M8{--shiki-light:#024C1A;--shiki-default:#024C1A;--shiki-dark:#72F088}",{"title":640,"searchDepth":667,"depth":667,"links":2734},[2735,2736,2738,2739,2741,2742,2744],{"id":525,"depth":667,"text":526},{"id":570,"depth":667,"text":2737},"Roll back from 2.​0 to 1.​4",{"id":2126,"depth":667,"text":1504},{"id":2188,"depth":667,"text":2740},"If 1.​4 will not start or misbehaves",{"id":2378,"depth":667,"text":2379},{"id":2519,"depth":667,"text":2743},"What a rollback does to $KRAFT_​HOME",{"id":2710,"depth":667,"text":2711},"What a rollback does to the database and the config directory, and the steps that take an upgraded install from 2.0 back to 1.4.","md",null,{},true,{"title":180,"description":2745},"AsK6bmvS5PO3UVgNyI4WNi7rX3kcXZAZJVAO19nqcm4",[2753,2755],{"title":176,"path":177,"stem":178,"description":2754,"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.",{"title":184,"path":185,"stem":186,"description":2756,"children":-1},"The Kraft Lite plugin, which runs a chain inside one agent session with no service, and its slash commands.",1791801253809]