[{"data":1,"prerenderedAt":3543},["ShallowReactive",2],{"navigation_docs":3,"-reference-configuration-addons":520,"-reference-configuration-addons-surround":3538},[4,28,51,191,222,485],{"title":5,"path":6,"stem":7,"children":8},"Get started","\u002Fget-started","1.get-started",[9,12,16,20,24],{"title":10,"path":6,"stem":11},"Overview","1.get-started\u002Findex",{"title":13,"path":14,"stem":15},"Why Kraft","\u002Fget-started\u002Fwhy-kraft","1.get-started\u002F0.why-kraft",{"title":17,"path":18,"stem":19},"Install","\u002Fget-started\u002Finstall","1.get-started\u002F1.install",{"title":21,"path":22,"stem":23},"Your first work item","\u002Fget-started\u002Ffirst-work-item","1.get-started\u002F2.first-work-item",{"title":25,"path":26,"stem":27},"FAQ","\u002Fget-started\u002Ffaq","1.get-started\u002F3.faq",{"title":29,"path":30,"stem":31,"children":32},"Concepts","\u002Fconcepts","2.concepts",[33,35,39,43,47],{"title":10,"path":30,"stem":34},"2.concepts\u002Findex",{"title":36,"path":37,"stem":38},"How a work item runs","\u002Fconcepts\u002Fhow-a-work-item-runs","2.concepts\u002F1.how-a-work-item-runs",{"title":40,"path":41,"stem":42},"Caps and budgets","\u002Fconcepts\u002Fcaps-and-budgets","2.concepts\u002F2.caps-and-budgets",{"title":44,"path":45,"stem":46},"Why a permission gate","\u002Fconcepts\u002Fpermission-gate","2.concepts\u002F3.permission-gate",{"title":48,"path":49,"stem":50},"Vocabulary","\u002Fconcepts\u002Fvocabulary","2.concepts\u002F4.vocabulary",{"title":52,"path":53,"stem":54,"children":55},"Guides","\u002Fguides","3.guides",[56,58,96,117,138,187],{"title":10,"path":53,"stem":57},"3.guides\u002Findex",{"title":59,"path":60,"stem":61,"children":62,"page":95},"Day to day","\u002Fguides\u002Fday-to-day","3.guides\u002F1.day-to-day",[63,67,71,75,79,83,87,91],{"title":64,"path":65,"stem":66},"The setup wizard on first start","\u002Fguides\u002Fday-to-day\u002Ffirst-run","3.guides\u002F1.day-to-day\u002F2.first-run",{"title":68,"path":69,"stem":70},"File a work item","\u002Fguides\u002Fday-to-day\u002Ffile-a-work-item","3.guides\u002F1.day-to-day\u002F3.file-a-work-item",{"title":72,"path":73,"stem":74},"Use Kraft from your agent","\u002Fguides\u002Fday-to-day\u002Fagent-integration","3.guides\u002F1.day-to-day\u002F4.agent-integration",{"title":76,"path":77,"stem":78},"Reviewing a change","\u002Fguides\u002Fday-to-day\u002Freview-a-change","3.guides\u002F1.day-to-day\u002F5.review-a-change",{"title":80,"path":81,"stem":82},"Raise a cap on a stopped item","\u002Fguides\u002Fday-to-day\u002Fraise-a-cap","3.guides\u002F1.day-to-day\u002F6.raise-a-cap",{"title":84,"path":85,"stem":86},"Kraft for VS Code","\u002Fguides\u002Fday-to-day\u002Fvscode","3.guides\u002F1.day-to-day\u002F7.vscode",{"title":88,"path":89,"stem":90},"Kraft on a phone","\u002Fguides\u002Fday-to-day\u002Fkraft-on-a-phone","3.guides\u002F1.day-to-day\u002F8.kraft-on-a-phone",{"title":92,"path":93,"stem":94},"Get notified when an item needs you","\u002Fguides\u002Fday-to-day\u002Fnotifications","3.guides\u002F1.day-to-day\u002F9.notifications",false,{"title":97,"path":98,"stem":99,"children":100,"page":95},"Customize and automate","\u002Fguides\u002Fcustomize","3.guides\u002F2.customize",[101,105,109,113],{"title":102,"path":103,"stem":104},"Write your own chain","\u002Fguides\u002Fcustomize\u002Fwrite-your-own-chain","3.guides\u002F2.customize\u002F1.write-your-own-chain",{"title":106,"path":107,"stem":108},"Add a security review or a gate reviewer","\u002Fguides\u002Fcustomize\u002Fadd-review-agents","3.guides\u002F2.customize\u002F2.add-review-agents",{"title":110,"path":111,"stem":112},"Schedule or webhook work","\u002Fguides\u002Fcustomize\u002Fschedule-and-webhook-work","3.guides\u002F2.customize\u002F3.schedule-and-webhook-work",{"title":114,"path":115,"stem":116},"Share chains with add-ons","\u002Fguides\u002Fcustomize\u002Fshare-chains-with-addons","3.guides\u002F2.customize\u002F4.share-chains-with-addons",{"title":118,"path":119,"stem":120,"children":121,"page":95},"Agents and harnesses","\u002Fguides\u002Fharnesses","3.guides\u002F3.harnesses",[122,126,130,134],{"title":123,"path":124,"stem":125},"Switch a task to another harness","\u002Fguides\u002Fharnesses\u002Fswitch-harness","3.guides\u002F3.harnesses\u002F1.switch-harness",{"title":127,"path":128,"stem":129},"Add or override a harness","\u002Fguides\u002Fharnesses\u002Fadding-a-harness","3.guides\u002F3.harnesses\u002F2.adding-a-harness",{"title":131,"path":132,"stem":133},"Build a worker Kit","\u002Fguides\u002Fharnesses\u002Fworker-kit","3.guides\u002F3.harnesses\u002F3.worker-kit",{"title":135,"path":136,"stem":137},"Give a worker its login","\u002Fguides\u002Fharnesses\u002Fgive-a-worker-its-login","3.guides\u002F3.harnesses\u002F4.give-a-worker-its-login",{"title":139,"path":140,"stem":141,"children":142,"page":95},"Run the server","\u002Fguides\u002Frun","3.guides\u002F4.run",[143,147,151,155,159,163,167,171,175,179,183],{"title":144,"path":145,"stem":146},"Remote access","\u002Fguides\u002Frun\u002Fremote-access","3.guides\u002F4.run\u002F01.remote-access",{"title":148,"path":149,"stem":150},"Put a proxy in front of Kraft","\u002Fguides\u002Frun\u002Fput-a-proxy-in-front-of-kraft","3.guides\u002F4.run\u002F02.put-a-proxy-in-front-of-kraft",{"title":152,"path":153,"stem":154},"Restart Kraft without ending running agents","\u002Fguides\u002Frun\u002Frestart-kraft","3.guides\u002F4.run\u002F03.restart-kraft",{"title":156,"path":157,"stem":158},"Back up and restore the database","\u002Fguides\u002Frun\u002Fback-up-and-restore","3.guides\u002F4.run\u002F04.back-up-and-restore",{"title":160,"path":161,"stem":162},"Logs and disk space","\u002Fguides\u002Frun\u002Flogs-and-disk-space","3.guides\u002F4.run\u002F05.logs-and-disk-space",{"title":164,"path":165,"stem":166},"Run Kraft as a service","\u002Fguides\u002Frun\u002Frun-as-a-service","3.guides\u002F4.run\u002F06.run-as-a-service",{"title":168,"path":169,"stem":170},"Upgrade Kraft","\u002Fguides\u002Frun\u002Fupgrade-kraft","3.guides\u002F4.run\u002F07.upgrade-kraft",{"title":172,"path":173,"stem":174},"Upgrade your configuration","\u002Fguides\u002Frun\u002Fupgrade-your-configuration","3.guides\u002F4.run\u002F08.upgrade-your-configuration",{"title":176,"path":177,"stem":178},"Upgrade from 1.4","\u002Fguides\u002Frun\u002Fupgrade-from-1-4","3.guides\u002F4.run\u002F09.upgrade-from-1-4",{"title":180,"path":181,"stem":182},"Upgrade from 0.x or a release candidate","\u002Fguides\u002Frun\u002Fupgrade-from-0-x-or-a-release-candidate","3.guides\u002F4.run\u002F10.upgrade-from-0-x-or-a-release-candidate",{"title":184,"path":185,"stem":186},"Roll back to 1.4","\u002Fguides\u002Frun\u002Froll-back","3.guides\u002F4.run\u002F11.roll-back",{"title":188,"path":189,"stem":190},"Kraft Lite","\u002Fguides\u002Fkraft-lite","3.guides\u002F5.kraft-lite",{"title":192,"path":193,"stem":194,"children":195},"Troubleshooting","\u002Ftroubleshooting","4.troubleshooting",[196,198,202,206,210,214,218],{"title":10,"path":193,"stem":197},"4.troubleshooting\u002Findex",{"title":199,"path":200,"stem":201},"Why did my item stop?","\u002Ftroubleshooting\u002Fwhy-did-my-item-stop","4.troubleshooting\u002F1.why-did-my-item-stop",{"title":203,"path":204,"stem":205},"Stop reasons in detail","\u002Ftroubleshooting\u002Fstop-reasons-in-detail","4.troubleshooting\u002F2.stop-reasons-in-detail",{"title":207,"path":208,"stem":209},"Starting and reaching Kraft","\u002Ftroubleshooting\u002Fstarting-and-reaching-kraft","4.troubleshooting\u002F3.starting-and-reaching-kraft",{"title":211,"path":212,"stem":213},"Doctor failures","\u002Ftroubleshooting\u002Fdoctor-failures","4.troubleshooting\u002F4.doctor-failures",{"title":215,"path":216,"stem":217},"Sandbox and Kit stops","\u002Ftroubleshooting\u002Fsandbox-and-kit-stops","4.troubleshooting\u002F5.sandbox-and-kit-stops",{"title":219,"path":220,"stem":221},"Add-on problems","\u002Ftroubleshooting\u002Faddon-problems","4.troubleshooting\u002F6.addon-problems",{"title":223,"path":224,"stem":225,"children":226},"Reference","\u002Freference","5.reference",[227,229,267,289,293,391,409,435,439,443,477,481],{"title":10,"path":224,"stem":228},"5.reference\u002Findex",{"title":230,"path":231,"stem":232,"children":233},"Web UI","\u002Freference\u002Fweb-ui","5.reference\u002F00.web-ui\u002Findex",[234,235,239,243,247,251,255,259,263],{"title":10,"path":231,"stem":232},{"title":236,"path":237,"stem":238},"Sidebar, search, and keyboard","\u002Freference\u002Fweb-ui\u002Fsidebar-search-and-keyboard","5.reference\u002F00.web-ui\u002F0.sidebar-search-and-keyboard",{"title":240,"path":241,"stem":242},"The board","\u002Freference\u002Fweb-ui\u002Fboard","5.reference\u002F00.web-ui\u002F1.board",{"title":244,"path":245,"stem":246},"An item's page","\u002Freference\u002Fweb-ui\u002Fitem-page","5.reference\u002F00.web-ui\u002F2.item-page",{"title":248,"path":249,"stem":250},"Fix loops and test scopes","\u002Freference\u002Fweb-ui\u002Ffix-loops-and-test-scopes","5.reference\u002F00.web-ui\u002F3.fix-loops-and-test-scopes",{"title":252,"path":253,"stem":254},"Config before an item starts","\u002Freference\u002Fweb-ui\u002Fconfig-before-start","5.reference\u002F00.web-ui\u002F4.config-before-start",{"title":256,"path":257,"stem":258},"The review page","\u002Freference\u002Fweb-ui\u002Freview-page","5.reference\u002F00.web-ui\u002F5.review-page",{"title":260,"path":261,"stem":262},"Templates and Settings","\u002Freference\u002Fweb-ui\u002Ftemplates-and-settings","5.reference\u002F00.web-ui\u002F6.templates-and-settings",{"title":264,"path":265,"stem":266},"Analytics","\u002Freference\u002Fweb-ui\u002Fanalytics","5.reference\u002F00.web-ui\u002F7.analytics",{"title":268,"path":269,"stem":270,"children":271},"CLI","\u002Freference\u002Fcli","5.reference\u002F01.cli\u002Findex",[272,273,277,281,285],{"title":10,"path":269,"stem":270},{"title":274,"path":275,"stem":276},"Item verbs","\u002Freference\u002Fcli\u002Fitem","5.reference\u002F01.cli\u002F2.item",{"title":278,"path":279,"stem":280},"View verbs","\u002Freference\u002Fcli\u002Fview","5.reference\u002F01.cli\u002F3.view",{"title":282,"path":283,"stem":284},"Repo verbs","\u002Freference\u002Fcli\u002Frepo","5.reference\u002F01.cli\u002F4.repo",{"title":286,"path":287,"stem":288},"Admin verbs","\u002Freference\u002Fcli\u002Fadmin","5.reference\u002F01.cli\u002F5.admin",{"title":290,"path":291,"stem":292},"Work item statuses","\u002Freference\u002Fstatuses","5.reference\u002F02.statuses",{"title":294,"path":295,"stem":296,"children":297},"Configuration","\u002Freference\u002Fconfiguration","5.reference\u002F03.configuration\u002Findex",[298,299,317,321,325,329,333,337,341,345,379,383,387],{"title":10,"path":295,"stem":296},{"title":300,"path":301,"stem":302,"children":303},"repos.yaml","\u002Freference\u002Fconfiguration\u002Frepos","5.reference\u002F03.configuration\u002F02.repos\u002Findex",[304,305,309,313],{"title":10,"path":301,"stem":302},{"title":306,"path":307,"stem":308},"How connect proposes commands","\u002Freference\u002Fconfiguration\u002Frepos\u002Fconnect-proposals","5.reference\u002F03.configuration\u002F02.repos\u002F1.connect-proposals",{"title":310,"path":311,"stem":312},"detectors.yaml","\u002Freference\u002Fconfiguration\u002Frepos\u002Fdetectors","5.reference\u002F03.configuration\u002F02.repos\u002F2.detectors",{"title":314,"path":315,"stem":316},"Workspaces","\u002Freference\u002Fconfiguration\u002Frepos\u002Fworkspaces","5.reference\u002F03.configuration\u002F02.repos\u002F3.workspaces",{"title":318,"path":319,"stem":320},"policy.yaml","\u002Freference\u002Fconfiguration\u002Fpolicy","5.reference\u002F03.configuration\u002F03.policy",{"title":322,"path":323,"stem":324},"Library and chains","\u002Freference\u002Fconfiguration\u002Flibrary-and-chains","5.reference\u002F03.configuration\u002F04.library-and-chains",{"title":326,"path":327,"stem":328},"harnesses.yaml","\u002Freference\u002Fconfiguration\u002Fharnesses-file","5.reference\u002F03.configuration\u002F05.harnesses-file",{"title":330,"path":331,"stem":332},"access.yaml","\u002Freference\u002Fconfiguration\u002Faccess","5.reference\u002F03.configuration\u002F06.access",{"title":334,"path":335,"stem":336},"intake.yaml","\u002Freference\u002Fconfiguration\u002Fintake","5.reference\u002F03.configuration\u002F07.intake",{"title":338,"path":339,"stem":340},"notify.yaml","\u002Freference\u002Fconfiguration\u002Fnotify","5.reference\u002F03.configuration\u002F08.notify",{"title":342,"path":343,"stem":344},"theme.yaml","\u002Freference\u002Fconfiguration\u002Ftheme","5.reference\u002F03.configuration\u002F09.theme",{"title":346,"path":347,"stem":348,"children":349},"Sandboxed workers","\u002Freference\u002Fconfiguration\u002Fsandbox","5.reference\u002F03.configuration\u002F10.sandbox\u002Findex",[350,351,355,359,363,367,371,375],{"title":10,"path":347,"stem":348},{"title":352,"path":353,"stem":354},"Resource limits","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fresource-limits","5.reference\u002F03.configuration\u002F10.sandbox\u002F1.resource-limits",{"title":356,"path":357,"stem":358},"Callbacks from a sandbox","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fcallbacks","5.reference\u002F03.configuration\u002F10.sandbox\u002F2.callbacks",{"title":360,"path":361,"stem":362},"Network policy","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fnetwork-policy","5.reference\u002F03.configuration\u002F10.sandbox\u002F3.network-policy",{"title":364,"path":365,"stem":366},"Credentials","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fcredentials","5.reference\u002F03.configuration\u002F10.sandbox\u002F4.credentials",{"title":368,"path":369,"stem":370},"Kits","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fkits","5.reference\u002F03.configuration\u002F10.sandbox\u002F5.kits",{"title":372,"path":373,"stem":374},"sandbox.yaml","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fsandbox-yaml","5.reference\u002F03.configuration\u002F10.sandbox\u002F6.sandbox-yaml",{"title":376,"path":377,"stem":378},"Git in a sandbox","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fgit-in-a-sandbox","5.reference\u002F03.configuration\u002F10.sandbox\u002F7.git-in-a-sandbox",{"title":380,"path":381,"stem":382},"Environment variables","\u002Freference\u002Fconfiguration\u002Fenvironment-variables","5.reference\u002F03.configuration\u002F11.environment-variables",{"title":384,"path":385,"stem":386},"Add-ons and collections","\u002Freference\u002Fconfiguration\u002Faddons","5.reference\u002F03.configuration\u002F12.addons",{"title":388,"path":389,"stem":390},"Repo libraries","\u002Freference\u002Fconfiguration\u002Frepo-libraries","5.reference\u002F03.configuration\u002F13.repo-libraries",{"title":392,"path":393,"stem":394,"children":395},"Chain file keys","\u002Freference\u002Fchain-nodes","5.reference\u002F04.chain-nodes\u002Findex",[396,397,401,405],{"title":10,"path":393,"stem":394},{"title":398,"path":399,"stem":400},"Subprocess tasks","\u002Freference\u002Fchain-nodes\u002Fsubprocess-tasks","5.reference\u002F04.chain-nodes\u002F2.subprocess-tasks",{"title":402,"path":403,"stem":404},"Fix loop and judge","\u002Freference\u002Fchain-nodes\u002Ffix-loop","5.reference\u002F04.chain-nodes\u002F3.fix-loop",{"title":406,"path":407,"stem":408},"Result file","\u002Freference\u002Fchain-nodes\u002Fresult-file","5.reference\u002F04.chain-nodes\u002F4.result-file",{"title":410,"path":411,"stem":412,"children":413},"Agent harnesses","\u002Freference\u002Fharnesses","5.reference\u002F05.harnesses\u002Findex",[414,415,419,423,427,431],{"title":10,"path":411,"stem":412},{"title":416,"path":417,"stem":418},"Unattended runs","\u002Freference\u002Fharnesses\u002Funattended-runs","5.reference\u002F05.harnesses\u002F2.unattended-runs",{"title":420,"path":421,"stem":422},"Agent profiles","\u002Freference\u002Fharnesses\u002Fagent-profiles","5.reference\u002F05.harnesses\u002F3.agent-profiles",{"title":424,"path":425,"stem":426},"Harness definition files","\u002Freference\u002Fharnesses\u002Fharness-files","5.reference\u002F05.harnesses\u002F4.harness-files",{"title":428,"path":429,"stem":430},"Fallback and escalation","\u002Freference\u002Fharnesses\u002Ffallback-and-escalation","5.reference\u002F05.harnesses\u002F5.fallback-and-escalation",{"title":432,"path":433,"stem":434},"Cost reporting","\u002Freference\u002Fharnesses\u002Fcost-reporting","5.reference\u002F05.harnesses\u002F6.cost-reporting",{"title":436,"path":437,"stem":438},"Permission gate","\u002Freference\u002Fpermissions","5.reference\u002F06.permissions",{"title":440,"path":441,"stem":442},"Inbound triggers","\u002Freference\u002Ftriggers","5.reference\u002F07.triggers",{"title":444,"path":445,"stem":446,"children":447},"HTTP API","\u002Freference\u002Fhttp-api","5.reference\u002F08.http-api\u002Findex",[448,449,453,457,461,465,469,473],{"title":10,"path":445,"stem":446},{"title":450,"path":451,"stem":452},"Filing, reading and changing work items","\u002Freference\u002Fhttp-api\u002Fwork-items","5.reference\u002F08.http-api\u002F2.work-items",{"title":454,"path":455,"stem":456},"Gates, run control, ending and retry","\u002Freference\u002Fhttp-api\u002Fgates-run-control-and-ending","5.reference\u002F08.http-api\u002F3.gates-run-control-and-ending",{"title":458,"path":459,"stem":460},"The work item object","\u002Freference\u002Fhttp-api\u002Fwork-item-object","5.reference\u002F08.http-api\u002F4.work-item-object",{"title":462,"path":463,"stem":464},"Budget, events, diff and documents","\u002Freference\u002Fhttp-api\u002Fbudget-and-events","5.reference\u002F08.http-api\u002F5.budget-and-events",{"title":466,"path":467,"stem":468},"Repos, chains, harnesses and the server","\u002Freference\u002Fhttp-api\u002Frepos-chains-harnesses-and-server","5.reference\u002F08.http-api\u002F6.repos-chains-harnesses-and-server",{"title":470,"path":471,"stem":472},"Drafts","\u002Freference\u002Fhttp-api\u002Fdrafts","5.reference\u002F08.http-api\u002F7.drafts",{"title":474,"path":475,"stem":476},"Ops for each draft area","\u002Freference\u002Fhttp-api\u002Fdraft-ops","5.reference\u002F08.http-api\u002F8.draft-ops",{"title":478,"path":479,"stem":480},"MCP tools","\u002Freference\u002Fmcp-tools","5.reference\u002F09.mcp-tools",{"title":482,"path":483,"stem":484},"Events","\u002Freference\u002Fevents","5.reference\u002F10.events",{"title":486,"path":487,"stem":488,"children":489},"Security and project","\u002Fproject","6.project",[490,492,496,500,504,508,512,516],{"title":10,"path":487,"stem":491},"6.project\u002Findex",{"title":493,"path":494,"stem":495},"Security","\u002Fproject\u002Fsecurity","6.project\u002F1.security",{"title":497,"path":498,"stem":499},"Data and privacy","\u002Fproject\u002Fdata-and-privacy","6.project\u002F2.data-and-privacy",{"title":501,"path":502,"stem":503},"What's new in 2.0","\u002Fproject\u002Fwhats-new","6.project\u002F3.whats-new",{"title":505,"path":506,"stem":507},"Status and support","\u002Fproject\u002Fstatus-and-support","6.project\u002F4.status-and-support",{"title":509,"path":510,"stem":511},"Architecture","\u002Fproject\u002Farchitecture","6.project\u002F5.architecture",{"title":513,"path":514,"stem":515},"Source map","\u002Fproject\u002Fsource-map","6.project\u002F6.source-map",{"title":517,"path":518,"stem":519},"Contributing","\u002Fproject\u002Fcontributing","6.project\u002F7.contributing",{"id":521,"title":384,"body":522,"description":3531,"extension":3532,"links":3533,"meta":3534,"navigation":3535,"path":385,"seo":3536,"stem":386,"__hash__":3537},"docs\u002F5.reference\u002F03.configuration\u002F12.addons.md",{"type":523,"value":524,"toc":3492},"minimark",[525,554,567,572,620,629,636,659,665,810,990,996,1001,1098,1298,1302,1307,1341,1366,1370,1373,1471,1490,1494,1497,1551,1554,1568,1572,1578,1645,1657,1660,1731,1744,1748,1758,1792,1859,1862,1928,1931,1934,1972,1981,1986,2118,2125,2129,2137,2240,2244,2266,2332,2335,2341,2391,2396,2422,2434,2440,2446,2566,2690,2694,2700,2758,2761,2792,2813,2827,2840,2844,2854,2858,2894,2916,2920,2923,2967,2985,2989,2995,3001,3104,3110,3113,3117,3123,3129,3146,3149,3181,3256,3262,3266,3278,3299,3303,3317,3328,3331,3346,3349,3363,3372,3376,3382,3434,3440,3444,3488],[526,527,528,529,534,535,539,540,544,545,549,550,553],"p",{},"A ",[530,531,533],"a",{"href":532},"\u002Fconcepts\u002Fvocabulary#add-on","Kraft add-on"," is a directory of chains, library components, skills and agent profiles. A ",[530,536,538],{"href":537},"\u002Fconcepts\u002Fvocabulary#collection","collection"," is a git repository or a directory that lists add-ons. Kraft ships no collection and has no directory of them, so you add each collection by its address, in one of the forms under ",[530,541,543],{"href":542},"#collection-sources","Collection sources",". ",[546,547,548],"code",{},"config\u002Faddons.yaml"," names the collections an instance knows and the add-ons it installed, and ",[546,551,552],{},"config\u002Faddons.lock"," records what each one resolved to.",[526,555,556,558,559,562,563,566],{},[530,557,114],{"href":115}," walks through publishing and installing one. The ",[546,560,561],{},"kraft admin addon"," verbs are in ",[530,564,286],{"href":565},"\u002Freference\u002Fcli\u002Fadmin#install-and-update-add-ons",".",[568,569,571],"h2",{"id":570},"a-collections-layout","A collection's layout",[573,574,580],"pre",{"className":575,"code":577,"language":578,"meta":579},[576],"language-text","acme-kraft\u002F\n  .kraft\u002Fcollection.json\n  addons\u002F\n    release\u002F\n      .kraft\u002Faddon.json\n      library.yaml\n      profiles.yaml\n      chains\u002Fship.yaml\n      skills\u002Frelease-notes\u002FSKILL.md\n","text","",[546,581,582,588,592,596,600,604,608,612,616],{"__ignoreMap":579},[583,584,587],"span",{"className":585},[586],"line","acme-kraft\u002F\n",[583,589,591],{"className":590},[586],"  .kraft\u002Fcollection.json\n",[583,593,595],{"className":594},[586],"  addons\u002F\n",[583,597,599],{"className":598},[586],"    release\u002F\n",[583,601,603],{"className":602},[586],"      .kraft\u002Faddon.json\n",[583,605,607],{"className":606},[586],"      library.yaml\n",[583,609,611],{"className":610},[586],"      profiles.yaml\n",[583,613,615],{"className":614},[586],"      chains\u002Fship.yaml\n",[583,617,619],{"className":618},[586],"      skills\u002Frelease-notes\u002FSKILL.md\n",[526,621,622,625,626,566],{},[546,623,624],{},".kraft\u002Fcollection.json"," sits at the root of the collection. Each add-on is a directory inside it with its own ",[546,627,628],{},".kraft\u002Faddon.json",[526,630,631,632,635],{},"Both manifests are JSON. Kraft ignores a top-level key it does not read, so a manifest written for a newer Kraft still loads, and ",[546,633,634],{},"kraft admin addon validate"," lists each such key as a warning. The JSON Schemas are published for editors:",[637,638,639,650],"ul",{},[640,641,642],"li",{},[530,643,647],{"href":644,"rel":645},"https:\u002F\u002Fkraft-sdlc.dev\u002Fschemas\u002Fcollection.schema.json",[646],"nofollow",[546,648,649],{},"collection.schema.json",[640,651,652],{},[530,653,656],{"href":654,"rel":655},"https:\u002F\u002Fkraft-sdlc.dev\u002Fschemas\u002Faddon.schema.json",[646],[546,657,658],{},"addon.schema.json",[568,660,662],{"id":661},"collectionjson",[546,663,664],{},"collection.json",[573,666,670],{"className":667,"code":668,"filename":624,"language":669,"meta":579,"style":579},"language-json shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","{\n  \"$schema\": \"https:\u002F\u002Fkraft-sdlc.dev\u002Fschemas\u002Fcollection.schema.json\",\n  \"name\": \"acme\",\n  \"description\": \"ACME's Kraft chains and review methods\",\n  \"owner\": { \"name\": \"ACME Platform\", \"email\": \"platform@acme.dev\" },\n  \"addons\": [\n    { \"name\": \"release\", \"source\": \".\u002Faddons\u002Frelease\", \"description\": \"Release chains\" }\n  ]\n}\n","json",[546,671,672,679,696,709,722,753,762,798,804],{"__ignoreMap":579},[583,673,675],{"class":586,"line":674},1,[583,676,678],{"class":677},"s7iLA","{\n",[583,680,682,686,689,693],{"class":586,"line":681},2,[583,683,685],{"class":684},"sb7M8","  \"$schema\"",[583,687,688],{"class":677},": ",[583,690,692],{"class":691},"semJd","\"https:\u002F\u002Fkraft-sdlc.dev\u002Fschemas\u002Fcollection.schema.json\"",[583,694,695],{"class":677},",\n",[583,697,699,702,704,707],{"class":586,"line":698},3,[583,700,701],{"class":684},"  \"name\"",[583,703,688],{"class":677},[583,705,706],{"class":691},"\"acme\"",[583,708,695],{"class":677},[583,710,712,715,717,720],{"class":586,"line":711},4,[583,713,714],{"class":684},"  \"description\"",[583,716,688],{"class":677},[583,718,719],{"class":691},"\"ACME's Kraft chains and review methods\"",[583,721,695],{"class":677},[583,723,725,728,731,734,736,739,742,745,747,750],{"class":586,"line":724},5,[583,726,727],{"class":684},"  \"owner\"",[583,729,730],{"class":677},": { ",[583,732,733],{"class":684},"\"name\"",[583,735,688],{"class":677},[583,737,738],{"class":691},"\"ACME Platform\"",[583,740,741],{"class":677},", ",[583,743,744],{"class":684},"\"email\"",[583,746,688],{"class":677},[583,748,749],{"class":691},"\"platform@acme.dev\"",[583,751,752],{"class":677}," },\n",[583,754,756,759],{"class":586,"line":755},6,[583,757,758],{"class":684},"  \"addons\"",[583,760,761],{"class":677},": [\n",[583,763,765,768,770,772,775,777,780,782,785,787,790,792,795],{"class":586,"line":764},7,[583,766,767],{"class":677},"    { ",[583,769,733],{"class":684},[583,771,688],{"class":677},[583,773,774],{"class":691},"\"release\"",[583,776,741],{"class":677},[583,778,779],{"class":684},"\"source\"",[583,781,688],{"class":677},[583,783,784],{"class":691},"\".\u002Faddons\u002Frelease\"",[583,786,741],{"class":677},[583,788,789],{"class":684},"\"description\"",[583,791,688],{"class":677},[583,793,794],{"class":691},"\"Release chains\"",[583,796,797],{"class":677}," }\n",[583,799,801],{"class":586,"line":800},8,[583,802,803],{"class":677},"  ]\n",[583,805,807],{"class":586,"line":806},9,[583,808,809],{"class":677},"}\n",[811,812,813,832],"table",{},[814,815,816],"thead",{},[817,818,819,823,826,829],"tr",{},[820,821,822],"th",{},"Field",[820,824,825],{},"Type",[820,827,828],{},"Required",[820,830,831],{},"Meaning",[833,834,835,862,878,907,926,944,976],"tbody",{},[817,836,837,843,848,851],{},[838,839,840],"td",{},[546,841,842],{},"name",[838,844,845],{},[530,846,842],{"href":847},"#names",[838,849,850],{},"yes",[838,852,853,854,857,858,861],{},"The collection's id: its key in ",[546,855,856],{},"addons.yaml",", and the part after ",[546,859,860],{},"@"," in an add-on id.",[817,863,864,869,872,875],{},[838,865,866],{},[546,867,868],{},"description",[838,870,871],{},"string",[838,873,874],{},"no",[838,876,877],{},"What the collection holds.",[817,879,880,885,888,890],{},[838,881,882],{},[546,883,884],{},"owner",[838,886,887],{},"object",[838,889,850],{},[838,891,892,894,895,898,899,902,903,906],{},[546,893,842],{}," and ",[546,896,897],{},"email",", both required, and an optional ",[546,900,901],{},"url",", which is an absolute ",[546,904,905],{},"https:\u002F\u002F"," URL.",[817,908,909,914,917,919],{},[838,910,911],{},[546,912,913],{},"addons",[838,915,916],{},"list",[838,918,850],{},[838,920,921,922,925],{},"At least one entry. No name is listed twice, and no entry's ",[546,923,924],{},"source"," is inside another's.",[817,927,928,933,935,937],{},[838,929,930],{},[546,931,932],{},"addons[].name",[838,934,842],{},[838,936,850],{},[838,938,939,940,943],{},"The same name the add-on's own ",[546,941,942],{},"addon.json"," declares.",[817,945,946,951,953,955],{},[838,947,948],{},[546,949,950],{},"addons[].source",[838,952,871],{},[838,954,850],{},[838,956,957,958,961,962,964,965,968,969,972,973,566],{},"The add-on's directory: ",[546,959,960],{},".\u002F"," and a relative path, with no ",[546,963,566],{}," or ",[546,966,967],{},".."," segment, no trailing ",[546,970,971],{},"\u002F",", and not inside ",[546,974,975],{},".kraft\u002F",[817,977,978,983,985,987],{},[838,979,980],{},[546,981,982],{},"addons[].description",[838,984,871],{},[838,986,874],{},[838,988,989],{},"What the add-on holds.",[526,991,992,993,995],{},"An add-on lives in its collection's own repository. A ",[546,994,924],{}," that is not a relative path is refused.",[568,997,999],{"id":998},"addonjson",[546,1000,942],{},[573,1002,1005],{"className":667,"code":1003,"filename":1004,"language":669,"meta":579,"style":579},"{\n  \"$schema\": \"https:\u002F\u002Fkraft-sdlc.dev\u002Fschemas\u002Faddon.schema.json\",\n  \"name\": \"release\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Release chains\",\n  \"requires\": { \"kraft\": \"2\", \"harnesses\": [\"claude\"], \"profiles\": [\"strong\"] }\n}\n","addons\u002Frelease\u002F.kraft\u002Faddon.json",[546,1006,1007,1011,1022,1032,1044,1054,1094],{"__ignoreMap":579},[583,1008,1009],{"class":586,"line":674},[583,1010,678],{"class":677},[583,1012,1013,1015,1017,1020],{"class":586,"line":681},[583,1014,685],{"class":684},[583,1016,688],{"class":677},[583,1018,1019],{"class":691},"\"https:\u002F\u002Fkraft-sdlc.dev\u002Fschemas\u002Faddon.schema.json\"",[583,1021,695],{"class":677},[583,1023,1024,1026,1028,1030],{"class":586,"line":698},[583,1025,701],{"class":684},[583,1027,688],{"class":677},[583,1029,774],{"class":691},[583,1031,695],{"class":677},[583,1033,1034,1037,1039,1042],{"class":586,"line":711},[583,1035,1036],{"class":684},"  \"version\"",[583,1038,688],{"class":677},[583,1040,1041],{"class":691},"\"1.0.0\"",[583,1043,695],{"class":677},[583,1045,1046,1048,1050,1052],{"class":586,"line":724},[583,1047,714],{"class":684},[583,1049,688],{"class":677},[583,1051,794],{"class":691},[583,1053,695],{"class":677},[583,1055,1056,1059,1061,1064,1066,1069,1071,1074,1077,1080,1083,1086,1088,1091],{"class":586,"line":755},[583,1057,1058],{"class":684},"  \"requires\"",[583,1060,730],{"class":677},[583,1062,1063],{"class":684},"\"kraft\"",[583,1065,688],{"class":677},[583,1067,1068],{"class":691},"\"2\"",[583,1070,741],{"class":677},[583,1072,1073],{"class":684},"\"harnesses\"",[583,1075,1076],{"class":677},": [",[583,1078,1079],{"class":691},"\"claude\"",[583,1081,1082],{"class":677},"], ",[583,1084,1085],{"class":684},"\"profiles\"",[583,1087,1076],{"class":677},[583,1089,1090],{"class":691},"\"strong\"",[583,1092,1093],{"class":677},"] }\n",[583,1095,1096],{"class":586,"line":764},[583,1097,809],{"class":677},[811,1099,1100,1112],{},[814,1101,1102],{},[817,1103,1104,1106,1108,1110],{},[820,1105,822],{},[820,1107,825],{},[820,1109,828],{},[820,1111,831],{},[833,1113,1114,1132,1153,1165,1188,1204,1218,1235,1259,1281],{},[817,1115,1116,1120,1124,1126],{},[838,1117,1118],{},[546,1119,842],{},[838,1121,1122],{},[530,1123,842],{"href":847},[838,1125,850],{},[838,1127,1128,1129,566],{},"The add-on's name and its default namespace. Never ",[546,1130,1131],{},"kraft",[817,1133,1134,1139,1141,1143],{},[838,1135,1136],{},[546,1137,1138],{},"version",[838,1140,871],{},[838,1142,850],{},[838,1144,1145,1148,1149,1152],{},[546,1146,1147],{},"MAJOR.MINOR.PATCH",", with an optional pre-release suffix such as ",[546,1150,1151],{},"2.0.0-rc.1",". No build metadata.",[817,1154,1155,1159,1161,1163],{},[838,1156,1157],{},[546,1158,868],{},[838,1160,871],{},[838,1162,874],{},[838,1164,989],{},[817,1166,1167,1172,1174,1176],{},[838,1168,1169],{},[546,1170,1171],{},"author",[838,1173,887],{},[838,1175,874],{},[838,1177,1178,894,1180,1182,1183,1185,1186,566],{},[546,1179,842],{},[546,1181,897],{},", both required when ",[546,1184,1171],{}," is given, and an optional ",[546,1187,901],{},[817,1189,1190,1195,1197,1199],{},[838,1191,1192],{},[546,1193,1194],{},"homepage",[838,1196,871],{},[838,1198,874],{},[838,1200,1201,1202,906],{},"An absolute ",[546,1203,905],{},[817,1205,1206,1211,1213,1215],{},[838,1207,1208],{},[546,1209,1210],{},"license",[838,1212,871],{},[838,1214,874],{},[838,1216,1217],{},"The license's name.",[817,1219,1220,1225,1227,1229],{},[838,1221,1222],{},[546,1223,1224],{},"requires",[838,1226,887],{},[838,1228,850],{},[838,1230,1231,1232,566],{},"What the add-on needs from the instance. An unknown key inside it is refused: ",[546,1233,1234],{},"requires.\u003Ckey> is not understood by this Kraft; upgrade Kraft",[817,1236,1237,1242,1244,1246],{},[838,1238,1239],{},[546,1240,1241],{},"requires.kraft",[838,1243,871],{},[838,1245,850],{},[838,1247,1248,964,1251,1254,1255,566],{},[546,1249,1250],{},"MAJOR",[546,1252,1253],{},"MAJOR.MINOR",". See ",[530,1256,1258],{"href":1257},"#which-kraft-an-add-on-runs-on","Which Kraft an add-on runs on",[817,1260,1261,1266,1269,1271],{},[838,1262,1263],{},[546,1264,1265],{},"requires.harnesses",[838,1267,1268],{},"list of names",[838,1270,874],{},[838,1272,1273,1277,1278,1280],{},[530,1274,1276],{"href":1275},"\u002Fconcepts\u002Fvocabulary#harness-profile","Harness profile"," ids the instance's ",[546,1279,326],{}," defines. The add-on's tasks name only these.",[817,1282,1283,1288,1290,1292],{},[838,1284,1285],{},[546,1286,1287],{},"requires.profiles",[838,1289,1268],{},[838,1291,874],{},[838,1293,1294,1297],{},[530,1295,420],{"href":1296},"\u002Fconcepts\u002Fvocabulary#agent-profile"," of the instance that the add-on's tasks select by bare name.",[1299,1300,1258],"h3",{"id":1301},"which-kraft-an-add-on-runs-on",[526,1303,1304,1306],{},[546,1305,1241],{}," names the oldest Kraft the add-on runs on, and that version's major is the only one it runs on.",[811,1308,1309,1320],{},[814,1310,1311],{},[817,1312,1313,1317],{},[820,1314,1315],{},[546,1316,1241],{},[820,1318,1319],{},"Runs on",[833,1321,1322,1331],{},[817,1323,1324,1328],{},[838,1325,1326],{},[546,1327,1068],{},[838,1329,1330],{},"Any 2.x.",[817,1332,1333,1338],{},[838,1334,1335],{},[546,1336,1337],{},"\"2.4\"",[838,1339,1340],{},"2.4.0 or later, below 3.0.0.",[637,1342,1343,1348,1359],{},[640,1344,1345,1346,566],{},"Only the release part of Kraft's version counts, so a release candidate of 2.4.0 satisfies ",[546,1347,1337],{},[640,1349,1350,1351,1353,1354,1358],{},"An add-on whose ",[546,1352,1241],{}," does not hold is refused at validate, install and update, and ",[530,1355,1357],{"href":1356},"#what-loads","left out"," at load.",[640,1360,1361,1362,1365],{},"A source build of Kraft, such as a checkout, skips the check. ",[546,1363,1364],{},"validate"," says so.",[568,1367,1369],{"id":1368},"an-add-ons-files","An add-on's files",[526,1371,1372],{},"Kraft reads these files of an add-on directory and nothing else. Each is optional, and an add-on with none of them is refused.",[811,1374,1375,1385],{},[814,1376,1377],{},[817,1378,1379,1382],{},[820,1380,1381],{},"Path",[820,1383,1384],{},"Holds",[833,1386,1387,1413,1435,1449],{},[817,1388,1389,1394],{},[838,1390,1391],{},[546,1392,1393],{},"library.yaml",[838,1395,1396,1397,741,1400,741,1403,894,1406,1409,1410,566],{},"The ",[546,1398,1399],{},"tasks",[546,1401,1402],{},"steps",[546,1404,1405],{},"nodes",[546,1407,1408],{},"steering"," sections, as in ",[530,1411,1412],{"href":323},"the local file",[817,1414,1415,1420],{},[838,1416,1417],{},[546,1418,1419],{},"chains\u002F\u003Cname>.yaml",[838,1421,1422,1423,1426,1427,1430,1431,1434],{},"One chain per file, as in ",[546,1424,1425],{},"config\u002Fchains\u002F",". The chain is named by its ",[546,1428,1429],{},"id",", or by ",[546,1432,1433],{},"\u003Cname>"," when it has none.",[817,1436,1437,1442],{},[838,1438,1439],{},[546,1440,1441],{},"skills\u002F\u003Cname>\u002FSKILL.md",[838,1443,1444,1445,1448],{},"One method per directory. Kraft reads the ",[546,1446,1447],{},"SKILL.md"," and no file beside it.",[817,1450,1451,1456],{},[838,1452,1453],{},[546,1454,1455],{},"profiles.yaml",[838,1457,528,1458,1461,1462,1466,1467,1470],{},[546,1459,1460],{},"profiles:"," section, in the shape of ",[530,1463,1465],{"href":1464},"\u002Freference\u002Fharnesses\u002Fagent-profiles#define-an-agent-profile","agent profiles",". A ",[546,1468,1469],{},"harnesses"," key is refused.",[526,1472,1473,1474,1476,1477,1479,1480,964,1483,1486,1487,1489],{},"Each ",[546,1475,1433],{}," is a ",[530,1478,842],{"href":847},". A file that looks like part of the layout and is not, such as ",[546,1481,1482],{},"chains\u002FShip.yaml",[546,1484,1485],{},"library.yml",", is not read, and ",[546,1488,1364],{}," warns about it. Any other file in the directory never reaches Kraft.",[1299,1491,1493],{"id":1492},"size-and-content-limits","Size and content limits",[526,1495,1496],{},"An add-on over one of these limits is refused, and the message names the file.",[811,1498,1499,1509],{},[814,1500,1501],{},[817,1502,1503,1506],{},[820,1504,1505],{},"Limit",[820,1507,1508],{},"Value",[833,1510,1511,1519,1527,1535,1543],{},[817,1512,1513,1516],{},[838,1514,1515],{},"Each YAML file",[838,1517,1518],{},"1 MiB, and 20,000 YAML nodes with each use of an alias counted",[817,1520,1521,1524],{},[838,1522,1523],{},"Each JSON manifest",[838,1525,1526],{},"256 KiB",[817,1528,1529,1533],{},[838,1530,1473,1531],{},[546,1532,1447],{},[838,1534,1526],{},[817,1536,1537,1540],{},[838,1538,1539],{},"Files in one add-on",[838,1541,1542],{},"500",[817,1544,1545,1548],{},[838,1546,1547],{},"One add-on in all",[838,1549,1550],{},"20 MiB",[526,1552,1553],{},"Every file is a regular file holding UTF-8 text. These are refused:",[637,1555,1556,1559,1562,1565],{},[640,1557,1558],{},"a symlink or a git submodule where a layout file or folder would be;",[640,1560,1561],{},"a Git LFS pointer in place of the file;",[640,1563,1564],{},"a file or a manifest string that carries a control character other than newline and tab, or a Unicode format character such as a bidi control or a zero-width character;",[640,1566,1567],{},"in a directory collection, a layout file with a second hard link.",[1299,1569,1571],{"id":1570},"what-an-add-on-may-set","What an add-on may set",[526,1573,528,1574,1577],{},[546,1575,1576],{},"policy:"," block in an add-on, at any level, takes only these keys:",[811,1579,1580,1590],{},[814,1581,1582],{},[817,1583,1584,1587],{},[820,1585,1586],{},"Key",[820,1588,1589],{},"Limits",[833,1591,1592,1608,1621,1631],{},[817,1593,1594,1605],{},[838,1595,1596,741,1599,741,1602],{},[546,1597,1598],{},"time_cap_minutes",[546,1600,1601],{},"total_time_cap_minutes",[546,1603,1604],{},"timeout_minutes",[838,1606,1607],{},"How long.",[817,1609,1610,1618],{},[838,1611,1612,741,1615],{},[546,1613,1614],{},"budget_usd",[546,1616,1617],{},"token_budget",[838,1619,1620],{},"How much.",[817,1622,1623,1628],{},[838,1624,1625],{},[546,1626,1627],{},"max_attempts",[838,1629,1630],{},"How many times.",[817,1632,1633,1638],{},[838,1634,1635],{},[546,1636,1637],{},"deny_tools",[838,1639,1640,1641,1644],{},"Which tools the ",[530,1642,1643],{"href":437},"permission gate"," denies.",[526,1646,1647,1652,1653,1656],{},[530,1648,1650],{"href":1649},"\u002Freference\u002Fconfiguration\u002Fpolicy#defaults-and-maxima",[546,1651,318],{}," defines each key. A limit above the instance's ",[546,1654,1655],{},"maxima:"," is refused.",[526,1658,1659],{},"An add-on is refused, with the file and key named, when it holds any of these:",[637,1661,1662,1669,1687,1700,1707,1722,1725],{},[640,1663,1664,1665,1668],{},"a task of ",[546,1666,1667],{},"kind: subprocess",";",[640,1670,1671,1672,1674,1675,741,1678,741,1681,964,1684,1668],{},"any other ",[546,1673,1576],{}," key, such as ",[546,1676,1677],{},"allowed_tools",[546,1679,1680],{},"grants",[546,1682,1683],{},"sandbox",[546,1685,1686],{},"allowed_harnesses",[640,1688,1689,1690,1693,1694,1696,1697,1668],{},"a ",[546,1691,1692],{},"harness:"," that ",[546,1695,1265],{}," does not list, in a task or in an agent profile's ",[546,1698,1699],{},"fallback",[640,1701,1689,1702,1704,1705,1668],{},[546,1703,1469],{}," section in ",[546,1706,1455],{},[640,1708,1709,1710,741,1713,964,1715,1718,1719,1721],{},"a qualified ",[546,1711,1712],{},"extends",[546,1714,1408],{},[546,1716,1717],{},"profile"," that names anything but the add-on itself, an agent profile's ",[546,1720,1699],{}," included;",[640,1723,1724],{},"a file nested deeper than its parser reads;",[640,1726,1689,1727,1730],{},[546,1728,1729],{},"skill"," that names another installed add-on.",[526,1732,1733,894,1736,1739,1740,1743],{},[546,1734,1735],{},"builtin",[546,1737,1738],{},"forge"," tasks are allowed, ",[546,1741,1742],{},"mr.merge"," included.",[568,1745,1747],{"id":1746},"names","Names",[526,1749,1750,1751,964,1754,1757],{},"A name is a lowercase letter, then lowercase letters, digits, ",[546,1752,1753],{},"_",[546,1755,1756],{},"-",". A collection name, an add-on name and an alias are at most 64 characters.",[637,1759,1760,1774,1783],{},[640,1761,1762,1766,1767,1770,1771,566],{},[1763,1764,1765],"strong",{},"An add-on id"," is ",[546,1768,1769],{},"\u003Caddon>@\u003Ccollection>",", such as ",[546,1772,1773],{},"release@acme",[640,1775,1776,1779,1780,566],{},[1763,1777,1778],{},"A namespace"," is the add-on's name, or the alias it was installed under with ",[546,1781,1782],{},"--as",[640,1784,1785,1766,1788,1791],{},[1763,1786,1787],{},"A qualified name",[546,1789,1790],{},"\u003Cnamespace>:\u003Cname>",". Everything an add-on declares is addressed that way from outside it.",[811,1793,1794,1804],{},[814,1795,1796],{},[817,1797,1798,1801],{},[820,1799,1800],{},"What",[820,1802,1803],{},"Qualified reference",[833,1805,1806,1819,1829,1839,1849],{},[817,1807,1808,1811],{},[838,1809,1810],{},"A chain",[838,1812,1813,741,1816],{},[546,1814,1815],{},"--chain release:ship",[546,1817,1818],{},"default_chain: release:ship",[817,1820,1821,1824],{},[838,1822,1823],{},"A task, step or node",[838,1825,1826],{},[546,1827,1828],{},"extends: release:implementer",[817,1830,1831,1834],{},[838,1832,1833],{},"A steering profile",[838,1835,1836],{},[546,1837,1838],{},"steering: [release:house-style]",[817,1840,1841,1844],{},[838,1842,1843],{},"A skill",[838,1845,1846],{},[546,1847,1848],{},"skill: release:release-notes",[817,1850,1851,1854],{},[838,1852,1853],{},"An agent profile",[838,1855,1856],{},[546,1857,1858],{},"profile: release:careful",[526,1860,1861],{},"Inside an add-on's own files, a reference resolves like this:",[811,1863,1864,1876],{},[814,1865,1866],{},[817,1867,1868,1870,1873],{},[820,1869,1586],{},[820,1871,1872],{},"A bare name means",[820,1874,1875],{},"Qualified",[833,1877,1878,1901,1915],{},[817,1879,1880,1888,1891],{},[838,1881,1882,741,1884,741,1886],{},[546,1883,1712],{},[546,1885,1408],{},[546,1887,1729],{},[838,1889,1890],{},"The add-on's own declaration.",[838,1892,1893,1894,1896,1897,1900],{},"The add-on's own name only. A ",[546,1895,1729],{}," may also name ",[546,1898,1899],{},"kraft:"," or another tool's plugin.",[817,1902,1903,1907,1910],{},[838,1904,1905],{},[546,1906,1717],{},[838,1908,1909],{},"The instance's agent profile.",[838,1911,1912,1913,566],{},"The add-on's own name, for a profile in its ",[546,1914,1455],{},[817,1916,1917,1922,1925],{},[838,1918,1919],{},[546,1920,1921],{},"harness",[838,1923,1924],{},"The instance's harness profile.",[838,1926,1927],{},"Never qualified.",[526,1929,1930],{},"A reference an add-on makes to its own name follows the alias, so an add-on installed under another namespace works unchanged.",[526,1932,1933],{},"These rules keep namespaces apart:",[637,1935,1936,1946,1949,1957,1969],{},[640,1937,1938,1940,1941,1943,1944,566],{},[546,1939,1131],{}," is reserved. No add-on is named ",[546,1942,1131],{}," and no alias is ",[546,1945,1131],{},[640,1947,1948],{},"A namespace is unique on the instance, a disabled add-on's included. A second add-on of the same name needs an alias.",[640,1950,1951,1952,1954,1955,566],{},"A namespace never equals the ",[546,1953,1429],{}," of an entry in ",[546,1956,300],{},[640,1958,1959,1960,1962,1963,1965,1966,566],{},"A local chain id, ",[546,1961,1393],{}," key or ",[546,1964,326],{}," agent profile id never contains ",[546,1967,1968],{},":",[640,1970,1971],{},"A bare name in local configuration never resolves to an add-on's declaration.",[526,1973,528,1974,1977,1978,1980],{},[546,1975,1976],{},"skill:"," whose qualifier is not a loaded add-on's namespace or ",[546,1979,1131],{}," is handed to the agent as another tool's plugin skill. A qualifier that is an installed add-on that did not load is an error.",[568,1982,1984],{"id":1983},"addonsyaml",[546,1985,856],{},[573,1987,1991],{"className":1988,"code":1989,"filename":548,"language":1990,"meta":579,"style":579},"language-yaml shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","collections:\n  acme:\n    git: https:\u002F\u002Fgithub.com\u002Facme\u002Fkraft-addons.git\n    ref: main\n  local:\n    path: \u002Fhome\u002Fyou\u002Fsrc\u002Fmy-addons\naddons:\n  release@acme: true\n  review-methods@acme: { auto_update: true }\n  mobile@acme: { as: acme-mobile }\n  legacy@acme: false\n  tools@local: true\n","yaml",[546,1992,1993,2001,2008,2018,2028,2035,2045,2051,2062,2079,2097,2108],{"__ignoreMap":579},[583,1994,1995,1998],{"class":586,"line":674},[583,1996,1997],{"class":684},"collections",[583,1999,2000],{"class":677},":\n",[583,2002,2003,2006],{"class":586,"line":681},[583,2004,2005],{"class":684},"  acme",[583,2007,2000],{"class":677},[583,2009,2010,2013,2015],{"class":586,"line":698},[583,2011,2012],{"class":684},"    git",[583,2014,688],{"class":677},[583,2016,2017],{"class":691},"https:\u002F\u002Fgithub.com\u002Facme\u002Fkraft-addons.git\n",[583,2019,2020,2023,2025],{"class":586,"line":711},[583,2021,2022],{"class":684},"    ref",[583,2024,688],{"class":677},[583,2026,2027],{"class":691},"main\n",[583,2029,2030,2033],{"class":586,"line":724},[583,2031,2032],{"class":684},"  local",[583,2034,2000],{"class":677},[583,2036,2037,2040,2042],{"class":586,"line":755},[583,2038,2039],{"class":684},"    path",[583,2041,688],{"class":677},[583,2043,2044],{"class":691},"\u002Fhome\u002Fyou\u002Fsrc\u002Fmy-addons\n",[583,2046,2047,2049],{"class":586,"line":764},[583,2048,913],{"class":684},[583,2050,2000],{"class":677},[583,2052,2053,2056,2058],{"class":586,"line":800},[583,2054,2055],{"class":684},"  release@acme",[583,2057,688],{"class":677},[583,2059,2061],{"class":2060},"ssYy9","true\n",[583,2063,2064,2067,2069,2072,2074,2077],{"class":586,"line":806},[583,2065,2066],{"class":684},"  review-methods@acme",[583,2068,730],{"class":677},[583,2070,2071],{"class":684},"auto_update",[583,2073,688],{"class":677},[583,2075,2076],{"class":2060},"true",[583,2078,797],{"class":677},[583,2080,2082,2085,2087,2090,2092,2095],{"class":586,"line":2081},10,[583,2083,2084],{"class":684},"  mobile@acme",[583,2086,730],{"class":677},[583,2088,2089],{"class":684},"as",[583,2091,688],{"class":677},[583,2093,2094],{"class":691},"acme-mobile",[583,2096,797],{"class":677},[583,2098,2100,2103,2105],{"class":586,"line":2099},11,[583,2101,2102],{"class":684},"  legacy@acme",[583,2104,688],{"class":677},[583,2106,2107],{"class":2060},"false\n",[583,2109,2111,2114,2116],{"class":586,"line":2110},12,[583,2112,2113],{"class":684},"  tools@local",[583,2115,688],{"class":677},[583,2117,2061],{"class":2060},[526,2119,2120,2121,2124],{},"Kraft never seeds this file: ",[546,2122,2123],{},"kraft admin addon collection add"," creates it. You may edit it by hand. A key Kraft does not read is refused at every level, with the key named.",[1299,2126,2127],{"id":1997},[546,2128,1997],{},[526,2130,2131,2132,2134,2135,943],{},"Each key is the ",[546,2133,842],{}," the collection's ",[546,2136,664],{},[811,2138,2139,2152],{},[814,2140,2141],{},[817,2142,2143,2145,2147,2150],{},[820,2144,822],{},[820,2146,825],{},[820,2148,2149],{},"Default",[820,2151,831],{},[833,2153,2154,2176,2197,2214],{},[817,2155,2156,2161,2163,2171],{},[838,2157,2158],{},[546,2159,2160],{},"git",[838,2162,871],{},[838,2164,2165,2166,964,2168],{},"one of ",[546,2167,2160],{},[546,2169,2170],{},"path",[838,2172,2173,2174,566],{},"A URL git clones. See ",[530,2175,543],{"href":542},[817,2177,2178,2182,2184,2190],{},[838,2179,2180],{},[546,2181,2170],{},[838,2183,871],{},[838,2185,2165,2186,964,2188],{},[546,2187,2160],{},[546,2189,2170],{},[838,2191,2192,2193,2196],{},"An absolute directory in normal form, read in place. ",[546,2194,2195],{},"~"," is not expanded.",[817,2198,2199,2204,2206,2209],{},[838,2200,2201],{},[546,2202,2203],{},"ref",[838,2205,871],{},[838,2207,2208],{},"the remote's default branch",[838,2210,2211,2212,566],{},"A branch, tag or commit of a git collection. A value YAML reads as a number needs quotes. Not allowed with ",[546,2213,2170],{},[817,2215,2216,2220,2223,2228],{},[838,2217,2218],{},[546,2219,2071],{},[838,2221,2222],{},"boolean",[838,2224,2225],{},[546,2226,2227],{},"false",[838,2229,2230,2231,544,2235,2237,2238,566],{},"Every add-on installed from the collection ",[530,2232,2234],{"href":2233},"#auto-update","updates itself",[546,2236,2076],{}," is refused with ",[546,2239,2170],{},[1299,2241,2242],{"id":913},[546,2243,913],{},[526,2245,2246,2247,2249,2250,741,2252,2254,2255,894,2257,2259,2260,894,2263,566],{},"Each key is an add-on id whose collection is under ",[546,2248,1997],{},". The value is ",[546,2251,2076],{},[546,2253,2227],{}," or a map. ",[546,2256,2076],{},[546,2258,2227],{}," are short for ",[546,2261,2262],{},"{enabled: true}",[546,2264,2265],{},"{enabled: false}",[811,2267,2268,2280],{},[814,2269,2270],{},[817,2271,2272,2274,2276,2278],{},[820,2273,822],{},[820,2275,825],{},[820,2277,2149],{},[820,2279,831],{},[833,2281,2282,2296,2314],{},[817,2283,2284,2288,2290,2293],{},[838,2285,2286],{},[546,2287,2089],{},[838,2289,842],{},[838,2291,2292],{},"the add-on's name",[838,2294,2295],{},"The namespace the add-on is installed under.",[817,2297,2298,2303,2305,2309],{},[838,2299,2300],{},[546,2301,2302],{},"enabled",[838,2304,2222],{},[838,2306,2307],{},[546,2308,2076],{},[838,2310,2311,2313],{},[546,2312,2227],{}," keeps the add-on installed and not loaded.",[817,2315,2316,2320,2322,2325],{},[838,2317,2318],{},[546,2319,2071],{},[838,2321,2222],{},[838,2323,2324],{},"unset",[838,2326,2327,2328,2331],{},"This add-on updates itself. Refused when its collection sets ",[546,2329,2330],{},"auto_update: true",", and for an add-on of a directory collection.",[1299,2333,543],{"id":2334},"collection-sources",[526,2336,2337,2340],{},[546,2338,2339],{},"kraft admin addon collection add SOURCE"," writes one of these:",[811,2342,2343,2355],{},[814,2344,2345],{},[817,2346,2347,2352],{},[820,2348,2349],{},[546,2350,2351],{},"SOURCE",[820,2353,2354],{},"Written as",[833,2356,2357,2368,2380],{},[817,2358,2359,2362],{},[838,2360,2361],{},"A directory that exists",[838,2363,2364,2367],{},[546,2365,2366],{},"path:",", as its absolute path.",[817,2369,2370,2375],{},[838,2371,2372],{},[546,2373,2374],{},"owner\u002Frepo",[838,2376,2377],{},[546,2378,2379],{},"git: https:\u002F\u002Fgithub.com\u002Fowner\u002Frepo.git",[817,2381,2382,2385],{},[838,2383,2384],{},"Anything else",[838,2386,2387,2390],{},[546,2388,2389],{},"git:",", as given.",[526,2392,2393,2395],{},[546,2394,2389],{}," takes these forms and no other:",[637,2397,2398,2404,2412,2417],{},[640,2399,2400,2403],{},[546,2401,2402],{},"https:\u002F\u002Fhost\u002Fpath",", with no credentials in it;",[640,2405,2406,964,2409,1668],{},[546,2407,2408],{},"ssh:\u002F\u002Fhost\u002Fpath",[546,2410,2411],{},"ssh:\u002F\u002Fuser@host\u002Fpath",[640,2413,2414,1668],{},[546,2415,2416],{},"file:\u002F\u002F\u002Fpath",[640,2418,2419,566],{},[546,2420,2421],{},"user@host:path",[526,2423,2424,741,2427,2430,2431,2433],{},[546,2425,2426],{},"http:\u002F\u002F",[546,2428,2429],{},"git:\u002F\u002F"," and a bare ",[546,2432,2374],{}," are refused in the file. A collection already added from another source is refused until it is removed.",[568,2435,2437],{"id":2436},"addonslock",[546,2438,2439],{},"addons.lock",[526,2441,2442,2443,2445],{},"Only ",[546,2444,561],{}," writes the lock. Each installed add-on has one entry:",[573,2447,2449],{"className":1988,"code":2448,"filename":552,"language":1990,"meta":579,"style":579},"# Written by `kraft admin addon`. Do not edit.\nlock_version: 1\naddons:\n  release@acme:\n    namespace: release\n    ref: main\n    git: https:\u002F\u002Fgithub.com\u002Facme\u002Fkraft-addons.git\n    commit: f4a11422cc8377a6ae61353897431dafa72b8ef5\n    tree: de1b745c4020ff2d468c14451da2f28a5fb56207\n    source: .\u002Faddons\u002Frelease\n    digest: sha256:f915f6266d319e9c0bc2bb2483683d74f307839138258901919e7d071fd37da4\n    version: 1.0.0\n    updated_at: '2026-10-10T13:23:58.690123Z'\n",[546,2450,2451,2457,2467,2473,2479,2489,2497,2505,2515,2525,2535,2545,2555],{"__ignoreMap":579},[583,2452,2453],{"class":586,"line":674},[583,2454,2456],{"class":2455},"sq92B","# Written by `kraft admin addon`. Do not edit.\n",[583,2458,2459,2462,2464],{"class":586,"line":681},[583,2460,2461],{"class":684},"lock_version",[583,2463,688],{"class":677},[583,2465,2466],{"class":2060},"1\n",[583,2468,2469,2471],{"class":586,"line":698},[583,2470,913],{"class":684},[583,2472,2000],{"class":677},[583,2474,2475,2477],{"class":586,"line":711},[583,2476,2055],{"class":684},[583,2478,2000],{"class":677},[583,2480,2481,2484,2486],{"class":586,"line":724},[583,2482,2483],{"class":684},"    namespace",[583,2485,688],{"class":677},[583,2487,2488],{"class":691},"release\n",[583,2490,2491,2493,2495],{"class":586,"line":755},[583,2492,2022],{"class":684},[583,2494,688],{"class":677},[583,2496,2027],{"class":691},[583,2498,2499,2501,2503],{"class":586,"line":764},[583,2500,2012],{"class":684},[583,2502,688],{"class":677},[583,2504,2017],{"class":691},[583,2506,2507,2510,2512],{"class":586,"line":800},[583,2508,2509],{"class":684},"    commit",[583,2511,688],{"class":677},[583,2513,2514],{"class":691},"f4a11422cc8377a6ae61353897431dafa72b8ef5\n",[583,2516,2517,2520,2522],{"class":586,"line":806},[583,2518,2519],{"class":684},"    tree",[583,2521,688],{"class":677},[583,2523,2524],{"class":691},"de1b745c4020ff2d468c14451da2f28a5fb56207\n",[583,2526,2527,2530,2532],{"class":586,"line":2081},[583,2528,2529],{"class":684},"    source",[583,2531,688],{"class":677},[583,2533,2534],{"class":691},".\u002Faddons\u002Frelease\n",[583,2536,2537,2540,2542],{"class":586,"line":2099},[583,2538,2539],{"class":684},"    digest",[583,2541,688],{"class":677},[583,2543,2544],{"class":691},"sha256:f915f6266d319e9c0bc2bb2483683d74f307839138258901919e7d071fd37da4\n",[583,2546,2547,2550,2552],{"class":586,"line":2110},[583,2548,2549],{"class":684},"    version",[583,2551,688],{"class":677},[583,2553,2554],{"class":2060},"1.0.0\n",[583,2556,2558,2561,2563],{"class":586,"line":2557},13,[583,2559,2560],{"class":684},"    updated_at",[583,2562,688],{"class":677},[583,2564,2565],{"class":691},"'2026-10-10T13:23:58.690123Z'\n",[811,2567,2568,2576],{},[814,2569,2570],{},[817,2571,2572,2574],{},[820,2573,822],{},[820,2575,831],{},[833,2577,2578,2588,2604,2618,2630,2642,2656,2670,2680],{},[817,2579,2580,2585],{},[838,2581,2582],{},[546,2583,2584],{},"namespace",[838,2586,2587],{},"The namespace the add-on was reviewed and installed under.",[817,2589,2590,2594],{},[838,2591,2592],{},[546,2593,2203],{},[838,2595,2596,2597,2599,2600,2603],{},"The collection's ",[546,2598,2203],{}," when it was locked. ",[546,2601,2602],{},"null"," for the default branch and for a directory collection.",[817,2605,2606,2610],{},[838,2607,2608],{},[546,2609,2160],{},[838,2611,2596,2612,2614,2615,2617],{},[546,2613,2160],{}," URL when it was locked. ",[546,2616,2602],{}," for a directory collection.",[817,2619,2620,2625],{},[838,2621,2622],{},[546,2623,2624],{},"commit",[838,2626,2627,2628,2617],{},"The collection's commit. ",[546,2629,2602],{},[817,2631,2632,2637],{},[838,2633,2634],{},[546,2635,2636],{},"tree",[838,2638,2639,2640,2617],{},"The git tree of the add-on's directory in that commit. ",[546,2641,2602],{},[817,2643,2644,2648],{},[838,2645,2646],{},[546,2647,924],{},[838,2649,2650,2651,2653,2654,566],{},"The add-on's ",[546,2652,924],{}," in ",[546,2655,664],{},[817,2657,2658,2663],{},[838,2659,2660],{},[546,2661,2662],{},"digest",[838,2664,2665,2669],{},[530,2666,2668],{"href":2667},"#the-digest","The digest"," of the add-on's files.",[817,2671,2672,2676],{},[838,2673,2674],{},[546,2675,1138],{},[838,2677,2650,2678,566],{},[546,2679,1138],{},[817,2681,2682,2687],{},[838,2683,2684],{},[546,2685,2686],{},"updated_at",[838,2688,2689],{},"When the entry was written.",[568,2691,2693],{"id":2692},"what-loads","What loads",[526,2695,2696,2697,2699],{},"An add-on loads when it has an enabled entry in ",[546,2698,856],{}," and an entry in the lock. Kraft reads it from the store the lock names and never fetches a collection to load the library.",[811,2701,2702,2712],{},[814,2703,2704],{},[817,2705,2706,2709],{},[820,2707,2708],{},"State",[820,2710,2711],{},"What Kraft does",[833,2713,2714,2725,2733,2741],{},[817,2715,2716,2719],{},[838,2717,2718],{},"Listed, with no lock entry",[838,2720,2721,2722,566],{},"Not loaded: ",[546,2723,2724],{},"is not installed; run `kraft admin addon install` ",[817,2726,2727,2730],{},[838,2728,2729],{},"Disabled",[838,2731,2732],{},"Not loaded. It keeps its namespace.",[817,2734,2735,2738],{},[838,2736,2737],{},"Locked, and not listed",[838,2739,2740],{},"Not loaded. The next accepted install or update, or an uninstall, drops the lock entry.",[817,2742,2743,2751],{},[838,2744,2745,2746,964,2748,2750],{},"The alias, or the collection's ",[546,2747,2203],{},[546,2749,2160],{}," URL, differs from the lock",[838,2752,2753,2754,2757],{},"Loaded under the locked namespace and commit, until ",[546,2755,2756],{},"kraft admin addon update"," applies the change after a review.",[526,2759,2760],{},"An add-on that fails one of these checks is left out by itself, and the rest of the library loads:",[637,2762,2763,2766,2769,2775,2780,2783,2786],{},[640,2764,2765],{},"its store is missing and not restored yet, or could not be restored;",[640,2767,2768],{},"its files do not match the locked digest;",[640,2770,2771,2772,2774],{},"its ",[546,2773,1241],{}," does not hold for the running Kraft;",[640,2776,2777,2779],{},[546,2778,326],{}," no longer defines a harness or agent profile it requires;",[640,2781,2782],{},"its namespace is now a repository id;",[640,2784,2785],{},"one of its own files no longer loads;",[640,2787,2788,2789,2791],{},"one of its limits is above a ",[546,2790,1655],{}," lowered since it was installed.",[526,2793,2794,2800,2801,2804,2805,2808,2809,2812],{},[530,2795,2797],{"href":2796},"\u002Freference\u002Fhttp-api#get-apihealth",[546,2798,2799],{},"GET \u002Fapi\u002Fhealth"," names each one under ",[546,2802,2803],{},"invalid_templates"," as ",[546,2806,2807],{},"add-on \u003Cid>"," with the reason, and answers ",[546,2810,2811],{},"degraded",". A chain of yours that extends a left-out add-on stops resolving. The add-on is still checked for updates.",[526,2814,2815,2816,964,2818,2820,2821,2823,2824,2826],{},"An ",[546,2817,856],{},[546,2819,2439],{}," that does not read loads no add-on at server start. On a reload the server keeps the add-ons it has. Either way ",[546,2822,2803],{}," names ",[546,2825,856],{}," with the reason.",[526,2828,2829,2830,741,2832,964,2834,2836,2837,566],{},"Saving a ",[546,2831,318],{},[546,2833,326],{},[546,2835,300],{}," that would leave a loaded add-on out is reported before it is applied: ",[546,2838,2839],{},"would leave add-on release@acme out: ...",[568,2841,2843],{"id":2842},"install-and-update","Install and update",[526,2845,2846,2847,2849,2850,2853],{},"An install or update fetches the collection, checks the add-on, checks the whole library with the add-on in it, and prints a review. It writes ",[546,2848,856],{},", the lock and the store only after the review is accepted. The fetch itself fills the collection's mirror under ",[546,2851,2852],{},"run\u002Faddons\u002Fmirrors\u002F"," before the review.",[1299,2855,2857],{"id":2856},"when-an-add-on-has-an-update","When an add-on has an update",[811,2859,2860,2870],{},[814,2861,2862],{},[817,2863,2864,2867],{},[820,2865,2866],{},"Collection",[820,2868,2869],{},"An update is waiting when",[833,2871,2872,2886],{},[817,2873,2874,2876],{},[838,2875,2160],{},[838,2877,2650,2878,2880,2881,964,2883,2885],{},[546,2879,1138],{}," differs from the lock's, higher or lower, or the collection's ",[546,2882,2203],{},[546,2884,2160],{}," URL, or the add-on's alias, was changed by hand. A new commit at the same version is not an update.",[817,2887,2888,2891],{},[838,2889,2890],{},"directory",[838,2892,2893],{},"The add-on's digest differs from the lock's, whatever its version, or its alias was changed by hand.",[637,2895,2896,2905,2913],{},[640,2897,2898,2901,2902,2904],{},[546,2899,2900],{},"kraft admin addon install ADDON@COLLECTION --re-install"," takes the commit the ",[546,2903,2203],{}," names now, at an unchanged version too.",[640,2906,2907,2909,2910,566],{},[546,2908,2756],{}," notes files that changed at an unchanged version: ",[546,2911,2912],{},"version 1.0.0 unchanged, but its files changed at \u003Ccommit>; --re-install to take it",[640,2914,2915],{},"An add-on its collection no longer lists stays on its locked version.",[1299,2917,2919],{"id":2918},"what-refuses-an-update","What refuses an update",[526,2921,2922],{},"A candidate is refused, and nothing is written, when:",[637,2924,2925,2931,2934,2937,2940,2943],{},[640,2926,2927,2928,1668],{},"it breaks a rule under ",[530,2929,1369],{"href":2930},"#an-add-ons-files",[640,2932,2933],{},"its namespace is another add-on's, or a repository id;",[640,2935,2936],{},"the instance lacks a harness or agent profile it requires;",[640,2938,2939],{},"a chain it ships does not resolve;",[640,2941,2942],{},"a chain of yours that resolves now would stop resolving;",[640,2944,1689,2945,964,2948,2653,2950,2952,2953,2653,2956,2958,2959,2961,2962,2653,2964,2966],{},[546,2946,2947],{},"default_chain",[546,2949,1408],{},[546,2951,300],{},", a ",[546,2954,2955],{},"chain",[546,2957,334],{}," or a ",[546,2960,318],{}," trigger, or an agent profile ",[546,2963,1699],{},[546,2965,326],{}," would stop resolving.",[526,2968,2969,2970,2973,2974,964,2976,2978,2979,2982,2983,566],{},"One add-on change runs at a time. A second one waits 5 seconds, then fails with ",[546,2971,2972],{},"another add-on change is running; try again",". An update writes nothing when ",[546,2975,856],{},[546,2977,2439],{}," changed while its review was open: ",[546,2980,2981],{},"add-ons changed while you reviewed; run update again",". Each message and its fix: ",[530,2984,219],{"href":220},[1299,2986,2988],{"id":2987},"the-review","The review",[526,2990,2991,2992,566],{},"The review compares the candidate with the locked version, or with nothing on an install. It prints two lists, with every control and format character written out as ",[546,2993,2994],{},"\\u{...}",[526,2996,2997,3000],{},[1763,2998,2999],{},"Reach"," is what can change how far a run goes:",[637,3002,3003,3010,3025,3034,3037,3057,3063,3073,3082,3088,3091,3094,3098,3101],{},[640,3004,3005,3006,3009],{},"a gate removed, or a gate's ",[546,3007,3008],{},"auto_review"," added or changed;",[640,3011,3012,3013,741,3016,741,3019,964,3022,1668],{},"a change to ",[546,3014,3015],{},"chain_finalized",[546,3017,3018],{},"skippable",[546,3020,3021],{},"reject_to",[546,3023,3024],{},"artifact_required",[640,3026,3027,3028,964,3030,3033],{},"an ",[546,3029,1742],{},[546,3031,3032],{},"mr.mark_ready"," step, with whether a gate comes before it;",[640,3035,3036],{},"a forge target the chain did not use before, or a forge step removed;",[640,3038,3039,3040,741,3042,741,3045,741,3048,964,3050,3052,3053,3056],{},"a task's ",[546,3041,1921],{},[546,3043,3044],{},"model",[546,3046,3047],{},"effort",[546,3049,1717],{},[546,3051,1699],{}," changed, a ",[546,3054,3055],{},"fallback: []"," removed among them;",[640,3058,3059,3060,3062],{},"an agent profile in ",[546,3061,1455],{}," changed;",[640,3064,3065,3066,3069,3070,3062],{},"a node or step no longer ",[546,3067,3068],{},"read_only",", or a task's ",[546,3071,3072],{},"scope",[640,3074,3075,3076,3078,3079,3081],{},"a limit set, raised or removed, a fix loop's ",[546,3077,1627],{}," among them, or a ",[546,3080,1637],{}," entry dropped;",[640,3083,3084,3085,3087],{},"the collection's ",[546,3086,2160],{}," URL changed;",[640,3089,3090],{},"the order of a chain's nodes, or of a node's steps, changed;",[640,3092,3093],{},"the installed version could not be read to compare with;",[640,3095,3096,3062],{},[546,3097,1224],{},[640,3099,3100],{},"a lower version, or a move from a release onto a pre-release;",[640,3102,3103],{},"each reference in your own files that the add-on's namespace now captures.",[526,3105,3106,3109],{},[1763,3107,3108],{},"Content"," is the rest: components added, removed or changed, each new or changed prompt and steering text, each agent profile added or removed, each skill as a diff, a lowered limit, and each new reference to another tool's plugin skill.",[526,3111,3112],{},"Both lists also cover each chain of yours that resolves through the add-on.",[1299,3114,3116],{"id":3115},"auto-update","Auto-update",[526,3118,3119,3120,3122],{},"An add-on auto-updates when its collection sets ",[546,3121,2330],{},", or its own entry does. The server runs it in the background after each start, and again once a day while it runs.",[526,3124,3125,3126,3128],{},"An auto-update applies an update only when its review has no ",[1763,3127,2999],{}," line. Anything else is held for a person, and the locked version keeps serving. It never does these:",[637,3130,3131,3134,3137],{},[640,3132,3133],{},"install an add-on that has no lock entry;",[640,3135,3136],{},"take a newer commit at an unchanged version;",[640,3138,3139,3140,3142,3143,3145],{},"apply an alias, a ",[546,3141,2203],{}," or a collection ",[546,3144,2160],{}," URL changed by hand.",[526,3147,3148],{},"Kraft does not fetch a collection none of whose installed add-ons auto-update, except to restore a missing store.",[526,3150,3151,3152,3155,3156,2653,3159,3161,3162,894,3165,3168,3169,3172,3173,3176,3177,3180],{},"Each add-on's last outcome is kept in ",[546,3153,3154],{},"run\u002Faddons\u002Fstatus.json"," and shown by ",[546,3157,3158],{},"addon_updates",[546,3160,2799],{},", as ",[546,3163,3164],{},"outcome",[546,3166,3167],{},"kind"," only: ",[546,3170,3171],{},"message"," stays in the file, because that endpoint needs no login. The ",[546,3174,3175],{},"add-on updates"," row of ",[546,3178,3179],{},"kraft admin doctor"," names the held and failed ones:",[811,3182,3183,3193],{},[814,3184,3185],{},[817,3186,3187,3191],{},[820,3188,3189],{},[546,3190,3164],{},[820,3192,831],{},[833,3194,3195,3205,3215,3230],{},[817,3196,3197,3202],{},[838,3198,3199],{},[546,3200,3201],{},"applied",[838,3203,3204],{},"The update was taken.",[817,3206,3207,3212],{},[838,3208,3209],{},[546,3210,3211],{},"up to date",[838,3213,3214],{},"Nothing to take.",[817,3216,3217,3222],{},[838,3218,3219],{},[546,3220,3221],{},"held",[838,3223,3224,3225,544,3227,3229],{},"A person must run ",[546,3226,2756],{},[546,3228,3171],{},", in the file and in doctor, says why.",[817,3231,3232,3237],{},[838,3233,3234],{},[546,3235,3236],{},"failed",[838,3238,3239,1766,3241,741,3244,741,3247,964,3250,3253,3254,3229],{},[546,3240,3167],{},[546,3242,3243],{},"network",[546,3245,3246],{},"auth",[546,3248,3249],{},"refused",[546,3251,3252],{},"busy",", and ",[546,3255,3171],{},[526,3257,3258,3259,3261],{},"A held or failed auto-update does not make health ",[546,3260,2811],{},". An entry is dropped once you apply the add-on's update yourself or uninstall the add-on.",[568,3263,3265],{"id":3264},"what-a-work-item-pins","What a work item pins",[526,3267,528,3268,3272,3273,3277],{},[530,3269,3271],{"href":3270},"\u002Fconcepts\u002Fvocabulary#work-item","work item","'s chain is copied at ",[530,3274,3276],{"href":3275},"\u002Fconcepts\u002Fvocabulary#intake","intake",", with every prompt and steering text in it. Two things are read later, at each launch: skills and agent profiles. For each add-on the chain resolved through, the item records the add-on's id, commit, tree, source, digest and version, and reads that add-on's skills and agent profiles from that version until the item ends.",[637,3279,3280,3283,3290],{},[640,3281,3282],{},"An update or an uninstall does not change a running item.",[640,3284,528,3285,3289],{},[530,3286,3288],{"href":3287},"\u002Fconcepts\u002Fvocabulary#chain-revision","chain revision"," resolves against the pinned versions.",[640,3291,1396,3292,3298],{},[530,3293,3295],{"href":3294},"\u002Freference\u002Fevents#chain-and-nodes",[546,3296,3297],{},"chain_loaded"," event carries the pins.",[568,3300,3302],{"id":3301},"restoring-a-store","Restoring a store",[526,3304,3305,3306,3309,3310,3313,3314,3316],{},"A store named by the lock or by a work item's pin can be missing: after ",[546,3307,3308],{},"config\u002F"," is copied to another machine, after ",[546,3311,3312],{},"run\u002F"," is cleared, or after a newer lock is put in ",[546,3315,3308],{},". Kraft restores it:",[637,3318,3319,3322,3325],{},[640,3320,3321],{},"in the background after the server starts, and with each daily auto-update check;",[640,3323,3324],{},"in the background after a reload;",[640,3326,3327],{},"before a launch that reads a version its work item pinned.",[526,3329,3330],{},"A restore takes the locked commit from the local mirror, or fetches that commit from the collection's URL. A directory collection is copied again. The files are kept only if their digest is the locked one. A restore is not a review.",[526,3332,3333,3334,3337,3338,3341,3342,566],{},"Until its store is back, an add-on is left out. Filing an item on one of its chains answers ",[546,3335,3336],{},"503"," with ",[546,3339,3340],{},"add-on \u003Cid> is being restored; retry",". A work item whose pinned store cannot be restored ",[530,3343,3345],{"href":3344},"\u002Ftroubleshooting\u002Fwhy-did-my-item-stop#a-task-kraft-would-not-launch","stops",[568,3347,2668],{"id":3348},"the-digest",[526,3350,3351,3352,3355,3356,964,3359,3362],{},"The digest is ",[546,3353,3354],{},"sha256:"," and the SHA-256 of a manifest with one line per file the add-on holds, sorted by path. Each line is the path, the git mode (",[546,3357,3358],{},"100644",[546,3360,3361],{},"100755",") and the SHA-256 of the file's bytes, separated by NUL bytes and ended by a newline.",[526,3364,3365,3366,3368,3369,566],{},"The same files give the same digest on every machine. ",[546,3367,634],{}," prints it, and the store keeps the manifest beside the files as ",[546,3370,3371],{},".kraft-digest",[568,3373,3375],{"id":3374},"on-disk","On disk",[526,3377,3378,3379,1968],{},"Add-on state lives under ",[546,3380,3381],{},"$KRAFT_HOME\u002Frun\u002Faddons\u002F",[811,3383,3384,3392],{},[814,3385,3386],{},[817,3387,3388,3390],{},[820,3389,1381],{},[820,3391,1384],{},[833,3393,3394,3404,3414,3424],{},[817,3395,3396,3401],{},[838,3397,3398],{},[546,3399,3400],{},"mirrors\u002F\u003Ccollection>-\u003Chash>.git",[838,3402,3403],{},"One bare git mirror per git collection. Kraft never checks out a working tree from it and never runs a hook.",[817,3405,3406,3411],{},[838,3407,3408],{},[546,3409,3410],{},"store\u002F\u003Cdigest>\u002F",[838,3412,3413],{},"One add-on's files, read-only, shared by every install with the same content.",[817,3415,3416,3421],{},[838,3417,3418],{},[546,3419,3420],{},"staging\u002F",[838,3422,3423],{},"A store being written.",[817,3425,3426,3431],{},[838,3427,3428],{},[546,3429,3430],{},"status.json",[838,3432,3433],{},"Each add-on's last auto-update.",[526,3435,3436,3437,3439],{},"The server deletes a store once the lock, the loaded library and every work item that has not ended no longer name it. ",[546,3438,561],{}," never deletes one.",[568,3441,3443],{"id":3442},"related","Related",[637,3445,3446,3451,3459,3465,3477],{},[640,3447,3448,3450],{},[530,3449,114],{"href":115},": publish a collection, install from one, and keep it current.",[640,3452,3453,3455,3456,3458],{},[530,3454,286],{"href":565},": every ",[546,3457,561],{}," verb and flag.",[640,3460,3461,3464],{},[530,3462,493],{"href":3463},"\u002Fproject\u002Fsecurity#kraft-add-ons",": what an add-on can and cannot change on an instance.",[640,3466,3467,3470,3471,894,3474,3476],{},[530,3468,211],{"href":3469},"\u002Ftroubleshooting\u002Fdoctor-failures#doctor-rows",": the ",[546,3472,3473],{},"add-ons",[546,3475,3175],{}," rows.",[640,3478,3479,3481,3482,3484,3485,3487],{},[530,3480,219],{"href":220},": the messages ",[546,3483,561],{}," prints when it refuses a collection or an add-on, and what ",[546,3486,1364],{}," rejects, with the fix for each.",[3489,3490,3491],"style",{},"html pre.shiki code .s7iLA, html code.shiki .s7iLA{--shiki-light:#0E1116;--shiki-default:#0E1116;--shiki-dark:#F0F3F6}html pre.shiki code .sb7M8, html code.shiki .sb7M8{--shiki-light:#024C1A;--shiki-default:#024C1A;--shiki-dark:#72F088}html pre.shiki code .semJd, html code.shiki .semJd{--shiki-light:#032563;--shiki-default:#032563;--shiki-dark:#ADDCFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .ssYy9, html code.shiki .ssYy9{--shiki-light:#023B95;--shiki-default:#023B95;--shiki-dark:#91CBFF}html pre.shiki code .sq92B, html code.shiki .sq92B{--shiki-light:#66707B;--shiki-default:#66707B;--shiki-dark:#BDC4CC}",{"title":579,"searchDepth":681,"depth":681,"links":3493},[3494,3495,3497,3502,3508,3509,3515,3517,3518,3526,3527,3528,3529,3530],{"id":570,"depth":681,"text":571},{"id":661,"depth":681,"text":3496},"collection.​json",{"id":998,"depth":681,"text":3498,"children":3499},"addon.​json",[3500],{"id":1301,"depth":698,"text":3501},"Which Kraft an add-​on runs on",{"id":1368,"depth":681,"text":3503,"children":3504},"An add-​on's files",[3505,3506],{"id":1492,"depth":698,"text":1493},{"id":1570,"depth":698,"text":3507},"What an add-​on may set",{"id":1746,"depth":681,"text":1747},{"id":1983,"depth":681,"text":3510,"children":3511},"addons.​yaml",[3512,3513,3514],{"id":1997,"depth":698,"text":1997},{"id":913,"depth":698,"text":913},{"id":2334,"depth":698,"text":543},{"id":2436,"depth":681,"text":3516},"addons.​lock",{"id":2692,"depth":681,"text":2693},{"id":2842,"depth":681,"text":2843,"children":3519},[3520,3522,3523,3524],{"id":2856,"depth":698,"text":3521},"When an add-​on has an update",{"id":2918,"depth":698,"text":2919},{"id":2987,"depth":698,"text":2988},{"id":3115,"depth":698,"text":3525},"Auto-​update",{"id":3264,"depth":681,"text":3265},{"id":3301,"depth":681,"text":3302},{"id":3348,"depth":681,"text":2668},{"id":3374,"depth":681,"text":3375},{"id":3442,"depth":681,"text":3443},"The files of a Kraft add-on and its collection, addons.yaml and addons.lock, the naming rules, what an add-on may set, and when an add-on loads, updates and is restored.","md",null,{},true,{"title":384,"description":3531},"c4FbbSvHhNp2da3cruoHBuGvFBmsoiUbPKg6YjUMoU4",[3539,3541],{"title":380,"path":381,"stem":382,"description":3540,"children":-1},"Every KRAFT_* variable Kraft reads or sets, the other variables it reads, and the variables a worker's environment gets.",{"title":388,"path":389,"stem":390,"description":3542,"children":-1},"A connected repository's .kraft\u002F folder as a library: its layout, names, where Kraft reads it from, how a person accepts it, automatic updates, the default chain, and repo-libraries.lock.",1791801175329]