[{"data":1,"prerenderedAt":2443},["ShallowReactive",2],{"navigation_docs":3,"-reference-configuration-policy":520,"-reference-configuration-policy-surround":2438},[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":318,"body":522,"description":2432,"extension":2433,"links":2434,"meta":2435,"navigation":619,"path":319,"seo":2436,"stem":320,"__hash__":2437},"docs\u002F5.reference\u002F03.configuration\u002F03.policy.md",{"type":523,"value":524,"toc":2418},"minimark",[525,542,553,558,753,773,778,1238,1244,1248,1259,1320,1512,1517,1520,1530,1577,1612,1615,1679,1686,1689,1763,1795,1798,1827,1971,1991,1995,2008,2249,2272,2275,2305,2311,2371,2391,2395,2414],[526,527,528,531,532,537,538,541],"p",{},[529,530,318],"code",{}," sets caps, budget, concurrency, archiving, and defaults for every ",[533,534,536],"a",{"href":535},"\u002Fconcepts\u002Fvocabulary#work-item","work item",". It lives at ",[529,539,540],{},"$KRAFT_HOME\u002Fconfig\u002Fpolicy.yaml",".",[526,543,544,547,548,552],{},[529,545,546],{},"kraft admin reload"," rereads this file with the same validation as startup. If the file does not validate, Kraft keeps the running ",[533,549,551],{"href":550},"\u002Fconcepts\u002Fvocabulary#policy","policy"," and reload exits 1 naming why. New loop caps apply to loops that start after the reload.",[526,554,555,556,541],{},"For how caps, maxima and layers combine, see ",[533,557,40],{"href":41},[559,560,566],"pre",{"className":561,"code":562,"filename":563,"language":564,"meta":565,"style":565},"language-yaml shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","loops: {}\ndefault: { attempts: 3, wall_clock_s: 3600 }\n\nfindings:\n  loop_severities: [critical, important]\n\nmax_concurrent: 3\n\nbudget:\n  work_item_usd: 10\n  daily_usd: 50\n\nrate_limit_retries: 5\nforge_cli_timeout_s: 120\n\narchive:\n  after_days: 30\n","config\u002Fpolicy.yaml","yaml","",[529,567,568,581,614,621,630,651,656,667,672,680,691,702,707,718,729,734,742],{"__ignoreMap":565},[569,570,573,577],"span",{"class":571,"line":572},"line",1,[569,574,576],{"class":575},"sb7M8","loops",[569,578,580],{"class":579},"s7iLA",": {}\n",[569,582,584,587,590,593,596,600,603,606,608,611],{"class":571,"line":583},2,[569,585,586],{"class":575},"default",[569,588,589],{"class":579},": { ",[569,591,592],{"class":575},"attempts",[569,594,595],{"class":579},": ",[569,597,599],{"class":598},"ssYy9","3",[569,601,602],{"class":579},", ",[569,604,605],{"class":575},"wall_clock_s",[569,607,595],{"class":579},[569,609,610],{"class":598},"3600",[569,612,613],{"class":579}," }\n",[569,615,617],{"class":571,"line":616},3,[569,618,620],{"emptyLinePlaceholder":619},true,"\n",[569,622,624,627],{"class":571,"line":623},4,[569,625,626],{"class":575},"findings",[569,628,629],{"class":579},":\n",[569,631,633,636,639,643,645,648],{"class":571,"line":632},5,[569,634,635],{"class":575},"  loop_severities",[569,637,638],{"class":579},": [",[569,640,642],{"class":641},"semJd","critical",[569,644,602],{"class":579},[569,646,647],{"class":641},"important",[569,649,650],{"class":579},"]\n",[569,652,654],{"class":571,"line":653},6,[569,655,620],{"emptyLinePlaceholder":619},[569,657,659,662,664],{"class":571,"line":658},7,[569,660,661],{"class":575},"max_concurrent",[569,663,595],{"class":579},[569,665,666],{"class":598},"3\n",[569,668,670],{"class":571,"line":669},8,[569,671,620],{"emptyLinePlaceholder":619},[569,673,675,678],{"class":571,"line":674},9,[569,676,677],{"class":575},"budget",[569,679,629],{"class":579},[569,681,683,686,688],{"class":571,"line":682},10,[569,684,685],{"class":575},"  work_item_usd",[569,687,595],{"class":579},[569,689,690],{"class":598},"10\n",[569,692,694,697,699],{"class":571,"line":693},11,[569,695,696],{"class":575},"  daily_usd",[569,698,595],{"class":579},[569,700,701],{"class":598},"50\n",[569,703,705],{"class":571,"line":704},12,[569,706,620],{"emptyLinePlaceholder":619},[569,708,710,713,715],{"class":571,"line":709},13,[569,711,712],{"class":575},"rate_limit_retries",[569,714,595],{"class":579},[569,716,717],{"class":598},"5\n",[569,719,721,724,726],{"class":571,"line":720},14,[569,722,723],{"class":575},"forge_cli_timeout_s",[569,725,595],{"class":579},[569,727,728],{"class":598},"120\n",[569,730,732],{"class":571,"line":731},15,[569,733,620],{"emptyLinePlaceholder":619},[569,735,737,740],{"class":571,"line":736},16,[569,738,739],{"class":575},"archive",[569,741,629],{"class":579},[569,743,745,748,750],{"class":571,"line":744},17,[569,746,747],{"class":575},"  after_days",[569,749,595],{"class":579},[569,751,752],{"class":598},"30\n",[526,754,755,756,759,760,763,764,541],{},"The shipped file also holds ",[529,757,758],{},"defaults:"," and ",[529,761,762],{},"maxima:"," as comments; see ",[533,765,767,759,770],{"href":766},"#defaults-and-maxima",[529,768,769],{},"defaults",[529,771,772],{},"maxima",[774,775,777],"h2",{"id":776},"top-level-keys","Top-level keys",[779,780,781,800],"table",{},[782,783,784],"thead",{},[785,786,787,791,794,797],"tr",{},[788,789,790],"th",{},"Field",[788,792,793],{},"Type",[788,795,796],{},"Default",[788,798,799],{},"Meaning",[801,802,803,829,866,882,914,930,947,964,996,1016,1034,1055,1074,1090,1110,1130,1150,1174,1195,1218],"tbody",{},[785,804,805,811,814,817],{},[806,807,808],"td",{},[529,809,810],{},"loops.\u003Cname>",[806,812,813],{},"mapping",[806,815,816],{},"none",[806,818,819,820,759,822,824,825,541],{},"Sets ",[529,821,592],{},[529,823,605],{}," for one named loop. See ",[533,826,828],{"href":827},"#loop-keys","Loop keys",[785,830,831,835,837,843],{},[806,832,833],{},[529,834,586],{},[806,836,813],{},[806,838,839,840],{},"required; shipped ",[529,841,842],{},"{attempts: 3, wall_clock_s: 3600}",[806,844,845,846,759,848,850,851,855,856,858,859,862,863,865],{},"The ",[529,847,592],{},[529,849,605],{}," ceiling for every ",[533,852,854],{"href":853},"\u002Fconcepts\u002Fvocabulary#fix-loop","fix loop"," not named in ",[529,857,576],{},"; a ",[529,860,861],{},"max_attempts"," on the loop itself wins. Without it ",[529,864,318],{}," does not load, and Kraft refuses new work.",[785,867,868,872,875,879],{},[806,869,870],{},[529,871,661],{},[806,873,874],{},"integer",[806,876,877],{},[529,878,599],{},[806,880,881],{},"How many work items may be active at once across all repos, however they were started. A start past the limit is queued, not refused.",[785,883,884,889,892,897],{},[806,885,886],{},[529,887,888],{},"auto_escalate_stuck",[806,890,891],{},"boolean",[806,893,894],{},[529,895,896],{},"true",[806,898,899,900,904,905,909,910,913],{},"Whether a ",[533,901,903],{"href":902},"\u002Fconcepts\u002Fvocabulary#stuck","stuck"," stop auto-dispatches an ",[533,906,908],{"href":907},"\u002Fconcepts\u002Fvocabulary#escalation-turn","escalation turn"," on a node that declares no ",[529,911,912],{},"escalation"," of its own.",[785,915,916,921,923,927],{},[806,917,918],{},[529,919,920],{},"auto_escalate_stuck_cap",[806,922,874],{},[806,924,925],{},[529,926,599],{},[806,928,929],{},"How many times one stuck run is auto-escalated before it is left for you.",[785,931,932,937,939,944],{},[806,933,934],{},[529,935,936],{},"auto_escalate_delay_s",[806,938,874],{},[806,940,941],{},[529,942,943],{},"0",[806,945,946],{},"Seconds to wait after the triggering event before an auto-escalation fires, so a person about to look is not preempted.",[785,948,949,954,956,961],{},[806,950,951],{},[529,952,953],{},"auto_review_attempts",[806,955,874],{},[806,957,958],{},[529,959,960],{},"1",[806,962,963],{},"How many automated-review attempts one pending gate may spend before it is left for you.",[785,965,966,970,973,978],{},[806,967,968],{},[529,969,723],{},[806,971,972],{},"number",[806,974,975],{},[529,976,977],{},"120",[806,979,980,981,985,986,602,989,602,992,995],{},"Seconds one ",[533,982,984],{"href":983},"\u002Fconcepts\u002Fvocabulary#forge","forge"," CLI call (",[529,987,988],{},"gh",[529,990,991],{},"glab",[529,993,994],{},"git",") may run before Kraft kills it and reports a forge error. Read at startup.",[785,997,998,1003,1005,1010],{},[806,999,1000],{},[529,1001,1002],{},"forge_poll_s",[806,1004,874],{},[806,1006,1007],{},[529,1008,1009],{},"300",[806,1011,1012,1013,541],{},"Seconds between the MR-closed poller's ticks, which ask the forge about every item parked at a merge-request node. Minimum ",[529,1014,1015],{},"30",[785,1017,1018,1023,1026,1031],{},[806,1019,1020],{},[529,1021,1022],{},"findings.loop_severities",[806,1024,1025],{},"list",[806,1027,1028],{},[529,1029,1030],{},"[critical, important]",[806,1032,1033],{},"Which review-finding severities burn a fix cycle; lower ones are recorded and shown at the human-review gate.",[785,1035,1036,1041,1043,1052],{},[806,1037,1038],{},[529,1039,1040],{},"budget.work_item_usd",[806,1042,972],{},[806,1044,1045,1048,1049],{},[529,1046,1047],{},"null"," (off); shipped ",[529,1050,1051],{},"10",[806,1053,1054],{},"Dollar cap per work item across all its loops. Remove the key to turn it off.",[785,1056,1057,1062,1064,1071],{},[806,1058,1059],{},[529,1060,1061],{},"budget.daily_usd",[806,1063,972],{},[806,1065,1066,1048,1068],{},[529,1067,1047],{},[529,1069,1070],{},"50",[806,1072,1073],{},"Dollar cap for every work item on this instance since local midnight. Remove the key to turn it off.",[785,1075,1076,1080,1082,1087],{},[806,1077,1078],{},[529,1079,712],{},[806,1081,874],{},[806,1083,1084],{},[529,1085,1086],{},"5",[806,1088,1089],{},"How many times Kraft relaunches a work item after a rejected API rate limit before stopping and waiting for you.",[785,1091,1092,1097,1099,1107],{},[806,1093,1094],{},[529,1095,1096],{},"archive.after_days",[806,1098,874],{},[806,1100,1101,1102,1104,1105],{},"unset (off); ",[529,1103,943],{}," is also off; shipped ",[529,1106,1015],{},[806,1108,1109],{},"Completed and abandoned items older than this auto-archive. The board's Done header shows the number, and no auto-archive note when the key is absent.",[785,1111,1112,1117,1120,1123],{},[806,1113,1114],{},[529,1115,1116],{},"storage.worktrees.limit",[806,1118,1119],{},"size",[806,1121,1122],{},"unset (off)",[806,1124,1125,1126,541],{},"The most disk worktrees may use. Over it, a start that needs a new worktree waits. See ",[533,1127,1129],{"href":1128},"#storage-keys","Storage keys",[785,1131,1132,1137,1139,1145],{},[806,1133,1134],{},[529,1135,1136],{},"storage.worktrees.quota",[806,1138,1119],{},[806,1140,1141,1142],{},"80% of ",[529,1143,1144],{},"limit",[806,1146,1147,1148,541],{},"Over it, Kraft warns and nothing else. Needs a ",[529,1149,1144],{},[785,1151,1152,1157,1160,1166],{},[806,1153,1154],{},[529,1155,1156],{},"storage.worktrees.auto_cleanup.min_age",[806,1158,1159],{},"age",[806,1161,1101,1162,1165],{},[529,1163,1164],{},"24h"," when the block is empty",[806,1167,1168,1169,1171,1172,541],{},"Over ",[529,1170,1144],{},", Kraft archives finished items that ended at least this long ago, oldest first. Needs a ",[529,1173,1144],{},[785,1175,1176,1181,1183,1185],{},[806,1177,1178],{},[529,1179,1180],{},"triggers",[806,1182,1025],{},[806,1184,816],{},[806,1186,1187,1188,1190,1191,541],{},"Moved to ",[529,1189,334],{},"; see ",[533,1192,1194],{"href":1193},"#retired-and-moved-keys","Retired and moved keys",[785,1196,1197,1201,1203,1206],{},[806,1198,1199],{},[529,1200,769],{},[806,1202,813],{},[806,1204,1205],{},"unset",[806,1207,1208,1209,1211,1212,541],{},"Starting points that any scope may move within ",[529,1210,772],{},". See ",[533,1213,1214,759,1216],{"href":766},[529,1215,769],{},[529,1217,772],{},[785,1219,1220,1224,1226,1229],{},[806,1221,1222],{},[529,1223,772],{},[806,1225,813],{},[806,1227,1228],{},"unset (no bound)",[806,1230,1231,1232,541],{},"The ceiling on policy overrides. See ",[533,1233,1234,759,1236],{"href":766},[529,1235,769],{},[529,1237,772],{},[526,1239,1240,1241,541],{},"A budget cap refuses to start the next agent task and cannot interrupt one that is running. See ",[533,1242,40],{"href":1243},"\u002Fconcepts\u002Fcaps-and-budgets#token-and-dollar-budgets",[1245,1246,1129],"h3",{"id":1247},"storage-keys",[526,1249,1250,1253,1254,1258],{},[529,1251,1252],{},"storage.worktrees"," bounds the disk the ",[533,1255,1257],{"href":1256},"\u002Fconcepts\u002Fvocabulary#worktree","worktrees"," use:",[559,1260,1262],{"className":561,"code":1261,"filename":563,"language":564,"meta":565,"style":565},"storage:\n  worktrees:\n    limit: 10G\n    quota: 8G\n    auto_cleanup:     # optional; the block being there turns it on\n      min_age: 24h\n",[529,1263,1264,1271,1278,1288,1298,1310],{"__ignoreMap":565},[569,1265,1266,1269],{"class":571,"line":572},[569,1267,1268],{"class":575},"storage",[569,1270,629],{"class":579},[569,1272,1273,1276],{"class":571,"line":583},[569,1274,1275],{"class":575},"  worktrees",[569,1277,629],{"class":579},[569,1279,1280,1283,1285],{"class":571,"line":616},[569,1281,1282],{"class":575},"    limit",[569,1284,595],{"class":579},[569,1286,1287],{"class":641},"10G\n",[569,1289,1290,1293,1295],{"class":571,"line":623},[569,1291,1292],{"class":575},"    quota",[569,1294,595],{"class":579},[569,1296,1297],{"class":641},"8G\n",[569,1299,1300,1303,1306],{"class":571,"line":632},[569,1301,1302],{"class":575},"    auto_cleanup",[569,1304,1305],{"class":579},":     ",[569,1307,1309],{"class":1308},"sq92B","# optional; the block being there turns it on\n",[569,1311,1312,1315,1317],{"class":571,"line":653},[569,1313,1314],{"class":575},"      min_age",[569,1316,595],{"class":579},[569,1318,1319],{"class":641},"24h\n",[1321,1322,1323,1348,1361,1378,1385,1400,1409,1423,1442,1476,1487,1500,1509],"ul",{},[1324,1325,1326,1327,602,1330,602,1333,1336,1337,1340,1341,1344,1345,1347],"li",{},"A size is a whole number and a unit, ",[529,1328,1329],{},"K",[529,1331,1332],{},"M",[529,1334,1335],{},"G"," or ",[529,1338,1339],{},"T",", in either case, and binary: ",[529,1342,1343],{},"1G"," is 1024³ bytes. A bare number such as ",[529,1346,1051],{}," is refused, because it would be a 10-byte limit.",[1324,1349,1350,1351,1353,1354,1357,1358,1360],{},"Without ",[529,1352,1144],{}," nothing is measured, warned about or held. ",[529,1355,1356],{},"quota"," without a ",[529,1359,1144],{},", or at or above it, is invalid.",[1324,1362,1363,1364,602,1367,759,1370,1373,1374,1377],{},"Kraft counts ",[529,1365,1366],{},"worktrees\u002F",[529,1368,1369],{},"sandbox-git\u002F",[529,1371,1372],{},"sandbox-home\u002F"," under ",[529,1375,1376],{},"run\u002F",": what archiving an item removes. Logs, databases, attachments and Docker's images and volumes are not counted.",[1324,1379,1380,1381,1384],{},"The figure is measured at startup and every 10 minutes, and matches ",[529,1382,1383],{},"du",". An archive or abandon takes that item's size off it at once.",[1324,1386,1387,1388,1390,1391,602,1393,759,1396,1399],{},"At or under ",[529,1389,1356],{},", nothing happens. Over ",[529,1392,1356],{},[529,1394,1395],{},"\u002Fapi\u002Fhealth",[529,1397,1398],{},"kraft admin doctor"," warn.",[1324,1401,1168,1402,1404,1405,1408],{},[529,1403,1144],{},", a start that would create a new worktree is queued until usage is back under the limit, and its item gets a ",[529,1406,1407],{},"work_item_storage_held"," event. A resume or retry of an item that already has a worktree is not held.",[1324,1410,1411,1412,1415,1416,1418,1419,541],{},"Unless ",[529,1413,1414],{},"auto_cleanup"," is set, Kraft never archives or deletes anything for the limit. ",[529,1417,1096],{}," works as before. See ",[533,1420,1422],{"href":1421},"\u002Fguides\u002Frun\u002Flogs-and-disk-space#limit-the-disk-worktrees-use","Limit the disk worktrees use",[1324,1424,1425,1427,1428,1431,1432,1435,1436,1439,1440,541],{},[529,1426,1414],{}," turns on automatic clean-up. ",[529,1429,1430],{},"auto_cleanup: {}"," is ",[529,1433,1434],{},"min_age: 24h",", and ",[529,1437,1438],{},"auto_cleanup:"," with nothing after it is off. It needs a ",[529,1441,1144],{},[1324,1443,1444,1447,1448,1336,1451,1454,1455,602,1458,602,1460,1463,1464,1467,1468,1471,1472,1475],{},[529,1445,1446],{},"min_age"," is a whole number and ",[529,1449,1450],{},"h",[529,1452,1453],{},"d",", in either case: ",[529,1456,1457],{},"12h",[529,1459,1164],{},[529,1461,1462],{},"2d",". Days are the largest unit, so ",[529,1465,1466],{},"1w"," is refused, and so is a bare ",[529,1469,1470],{},"24",". ",[529,1473,1474],{},"0h"," means no floor.",[1324,1477,1168,1478,1480,1481,1483,1484,1486],{},[529,1479,1144],{},", Kraft archives completed and abandoned items that have a worktree and ended at least ",[529,1482,1446],{}," ago, oldest first, until usage is at or under ",[529,1485,1356],{},". One archive runs at a time, and one item's failure is logged and skipped.",[1324,1488,1489,1490,1493,1494,759,1497,541],{},"Archiving removes the worktree and any uncommitted changes in it. A branch with unpushed commits is kept, and the item stays restorable under Archived. Its ",[529,1491,1492],{},"work_item_archived"," event carries ",[529,1495,1496],{},"by: auto",[529,1498,1499],{},"reason: storage",[1324,1501,1502,1503,1505,1506,1508],{},"When that cannot free enough, because every finished item is newer than ",[529,1504,1446],{}," or the rest is live work, starts stay held and ",[529,1507,1398],{}," says how many finished items were too recent.",[1324,1510,1511],{},"A running item can pass the limit between two measurements. The limit stops the next start, not work in flight.",[526,1513,1514,1516],{},[529,1515,546],{}," applies a change.",[1245,1518,828],{"id":1519},"loop-keys",[526,1521,1522,1524,1525,759,1527,1529],{},[529,1523,576],{}," maps a loop key to its own ",[529,1526,592],{},[529,1528,605],{},". A key that names no live loop is silently unused, so spell it exactly:",[779,1531,1532,1542],{},[782,1533,1534],{},[785,1535,1536,1539],{},[788,1537,1538],{},"Key",[788,1540,1541],{},"Names",[801,1543,1544,1557,1567],{},[785,1545,1546,1551],{},[806,1547,1548],{},[529,1549,1550],{},"\u003Cnode id>.fix_loop",[806,1552,1553,1554,541],{},"The fix loop of that exec node; see ",[533,1555,1556],{"href":403},"Fix loop",[785,1558,1559,1564],{},[806,1560,1561],{},[529,1562,1563],{},"\u003Cnode id>.on_base_changed",[806,1565,1566],{},"The restarts of that node when a rebase moves the base.",[785,1568,1569,1574],{},[806,1570,1571],{},[529,1572,1573],{},"\u003Cgate id>_reject_loop",[806,1575,1576],{},"The rejections of that gate.",[559,1578,1580],{"className":561,"code":1579,"filename":563,"language":564,"meta":565,"style":565},"loops:\n  verification.fix_loop: { attempts: 5, wall_clock_s: 7200 }\n",[529,1581,1582,1588],{"__ignoreMap":565},[569,1583,1584,1586],{"class":571,"line":572},[569,1585,576],{"class":575},[569,1587,629],{"class":579},[569,1589,1590,1593,1595,1597,1599,1601,1603,1605,1607,1610],{"class":571,"line":583},[569,1591,1592],{"class":575},"  verification.fix_loop",[569,1594,589],{"class":579},[569,1596,592],{"class":575},[569,1598,595],{"class":579},[569,1600,1086],{"class":598},[569,1602,602],{"class":579},[569,1604,605],{"class":575},[569,1606,595],{"class":579},[569,1608,1609],{"class":598},"7200",[569,1611,613],{"class":579},[1245,1613,1194],{"id":1614},"retired-and-moved-keys",[779,1616,1617,1629],{},[782,1618,1619],{},[785,1620,1621,1623,1626],{},[788,1622,1538],{},[788,1624,1625],{},"Replaced by",[788,1627,1628],{},"When a file still has it",[801,1630,1631,1655],{},[785,1632,1633,1637,1647],{},[806,1634,1635],{},[529,1636,1180],{},[806,1638,1639,1642,1643,1190,1645],{},[529,1640,1641],{},"schedules:"," in ",[529,1644,334],{},[533,1646,440],{"href":441},[806,1648,1649,1650,1652,1653,541],{},"Read, so an upgraded file keeps firing; ",[529,1651,1398],{}," names the move. New ones go in ",[529,1654,334],{},[785,1656,1657,1662,1673],{},[806,1658,1659],{},[529,1660,1661],{},"wait_timeout_minutes",[806,1663,1664,1667,1668,1642,1671],{},[529,1665,1666],{},"total_time_cap_minutes",", or ",[529,1669,1670],{},"maxima.tasks.total_time_cap_minutes",[529,1672,318],{},[806,1674,1675,1676,1678],{},"Read, with a warning in the log. In ",[529,1677,769],{}," it does not load. A save of a chain that sets it, or of a work item's override, is refused with the name to use.",[774,1680,1682,759,1684],{"id":1681},"defaults-and-maxima",[529,1683,769],{},[529,1685,772],{},[526,1687,1688],{},"Kraft ships these commented out, because an uncommented value is a real ceiling. This example is illustrative. Uncomment and edit it to use it:",[559,1690,1692],{"className":561,"code":1691,"filename":563,"language":564,"meta":565,"style":565},"# defaults:\n#   timeout_minutes: 60\n#   max_attempts: 3\n#   allowed_harnesses: [codex, claude]\n#   escalation_harness: claude\n#   work_item: { time_cap_minutes: 480, total_time_cap_minutes: 2880, budget_usd: 20 }\n#   nodes:     { time_cap_minutes: 180 }\n#   steps:     { time_cap_minutes: 120 }\n#   tasks:     { time_cap_minutes: 90 }\n# maxima:\n#   timeout_minutes: 180\n#   allowed_harnesses: [codex, claude]\n#   work_item: { time_cap_minutes: 1440, token_budget: 2000000, budget_usd: 25 }\n#   tasks:     { time_cap_minutes: 240, total_time_cap_minutes: 10080 }\n",[529,1693,1694,1699,1704,1709,1714,1719,1724,1729,1734,1739,1744,1749,1753,1758],{"__ignoreMap":565},[569,1695,1696],{"class":571,"line":572},[569,1697,1698],{"class":1308},"# defaults:\n",[569,1700,1701],{"class":571,"line":583},[569,1702,1703],{"class":1308},"#   timeout_minutes: 60\n",[569,1705,1706],{"class":571,"line":616},[569,1707,1708],{"class":1308},"#   max_attempts: 3\n",[569,1710,1711],{"class":571,"line":623},[569,1712,1713],{"class":1308},"#   allowed_harnesses: [codex, claude]\n",[569,1715,1716],{"class":571,"line":632},[569,1717,1718],{"class":1308},"#   escalation_harness: claude\n",[569,1720,1721],{"class":571,"line":653},[569,1722,1723],{"class":1308},"#   work_item: { time_cap_minutes: 480, total_time_cap_minutes: 2880, budget_usd: 20 }\n",[569,1725,1726],{"class":571,"line":658},[569,1727,1728],{"class":1308},"#   nodes:     { time_cap_minutes: 180 }\n",[569,1730,1731],{"class":571,"line":669},[569,1732,1733],{"class":1308},"#   steps:     { time_cap_minutes: 120 }\n",[569,1735,1736],{"class":571,"line":674},[569,1737,1738],{"class":1308},"#   tasks:     { time_cap_minutes: 90 }\n",[569,1740,1741],{"class":571,"line":682},[569,1742,1743],{"class":1308},"# maxima:\n",[569,1745,1746],{"class":571,"line":693},[569,1747,1748],{"class":1308},"#   timeout_minutes: 180\n",[569,1750,1751],{"class":571,"line":704},[569,1752,1713],{"class":1308},[569,1754,1755],{"class":571,"line":709},[569,1756,1757],{"class":1308},"#   work_item: { time_cap_minutes: 1440, token_budget: 2000000, budget_usd: 25 }\n",[569,1759,1760],{"class":571,"line":720},[569,1761,1762],{"class":1308},"#   tasks:     { time_cap_minutes: 240, total_time_cap_minutes: 10080 }\n",[526,1764,1765,1767,1768,602,1771,602,1773,602,1776,602,1779,1782,1783,1767,1785,602,1788,602,1790,602,1792,1794],{},[529,1766,769],{}," takes ",[529,1769,1770],{},"timeout_minutes",[529,1772,861],{},[529,1774,1775],{},"allowed_harnesses",[529,1777,1778],{},"escalation_harness",[529,1780,1781],{},"escalation_grants"," and the per-level caps. ",[529,1784,772],{},[529,1786,1787],{},"allowed_tools",[529,1789,1775],{},[529,1791,1770],{},[529,1793,861],{}," and the per-level caps.",[526,1796,1797],{},"Two rules hold for both sections:",[1321,1799,1800,1820],{},[1324,1801,1802,1803,1806,1807,1806,1810,1806,1813,1816,1817,1819],{},"A narrower level's cap may not exceed a broader one's (",[529,1804,1805],{},"tasks"," \u003C= ",[529,1808,1809],{},"steps",[529,1811,1812],{},"nodes",[529,1814,1815],{},"work_item","), and a ",[529,1818,769],{}," entry may not exceed its level's maximum. Kraft refuses either when it reads the file, naming both.",[1324,1821,1822,1823,1826],{},"A cap written flat (",[529,1824,1825],{},"defaults: time_cap_minutes: 30",") is refused, with a message naming the level form to use.",[779,1828,1829,1841],{},[782,1830,1831],{},[785,1832,1833,1835,1837,1839],{},[788,1834,790],{},[788,1836,793],{},[788,1838,796],{},[788,1840,799],{},[801,1842,1843,1863,1896,1925,1957],{},[785,1844,1845,1853,1856,1858],{},[806,1846,1847,602,1849,602,1851],{},[529,1848,1770],{},[529,1850,861],{},[529,1852,1775],{},[806,1854,1855],{},"integer, integer, list",[806,1857,1205],{},[806,1859,1860,1861,541],{},"Operational starting points that any layer may move in either direction, bounded only by ",[529,1862,772],{},[785,1864,1865,1869,1872,1877],{},[806,1866,1867],{},[529,1868,1778],{},[806,1870,1871],{},"string",[806,1873,1874],{},[529,1875,1876],{},"claude",[806,1878,845,1879,1642,1883,1885,1886,1889,1890,1892,1893,1895],{},[533,1880,1882],{"href":1881},"\u002Fconcepts\u002Fvocabulary#harness-profile","harness profile",[529,1884,326],{}," that an escalation turn runs on, or ",[529,1887,1888],{},"item",". In ",[529,1891,769],{}," only: a ",[529,1894,772],{}," that names it does not load, and Kraft refuses new work.",[785,1897,1898,1902,1904,1909],{},[806,1899,1900],{},[529,1901,1781],{},[806,1903,1025],{},[806,1905,1906],{},[529,1907,1908],{},"[git-commit, git-rebase, git-push]",[806,1910,845,1911,1915,1916,1919,1920,1922,1923,541],{},[533,1912,1914],{"href":1913},"\u002Fconcepts\u002Fvocabulary#grant","grants"," every escalation turn holds; ",[529,1917,1918],{},"[]"," is none. In ",[529,1921,769],{}," only, like ",[529,1924,1778],{},[785,1926,1927,1937,1939,1942],{},[806,1928,1929,602,1931,602,1933,602,1935],{},[529,1930,1815],{},[529,1932,1812],{},[529,1934,1809],{},[529,1936,1805],{},[806,1938,813],{},[806,1940,1941],{},"unset (unbounded)",[806,1943,1944,1945,602,1948,602,1950,759,1953,1956],{},"Per-level values for ",[529,1946,1947],{},"time_cap_minutes",[529,1949,1666],{},[529,1951,1952],{},"token_budget",[529,1954,1955],{},"budget_usd","; a gate is a node.",[785,1958,1959,1964,1966,1968],{},[806,1960,1961],{},[529,1962,1963],{},"maxima.allowed_tools",[806,1965,1025],{},[806,1967,1228],{},[806,1969,1970],{},"A safety field that starts at its maximum and can only be narrowed.",[1972,1973,1974,1975,1977,1978,1982,1983,1985,1986,1990],"warning",{},"Do not set ",[529,1976,1963],{}," unless every ",[533,1979,1981],{"href":1980},"\u002Fconcepts\u002Fvocabulary#harness","harness"," you use can run under it. A safety field set only in ",[529,1984,772],{}," binds every task. See ",[533,1987,1989],{"href":1988},"#tool-lists","Tool lists"," for the harnesses that refuse a list.",[774,1992,1994],{"id":1993},"policy-fields","Policy fields",[526,1996,1997,1998,2001,2002,2004,2005,2007],{},"These keys go in a ",[529,1999,2000],{},"policy:"," block on a repo (",[529,2003,300],{},"), a chain, a node, a step, a task, or a work item's override. Kraft applies the layers from the broadest to the narrowest. The \"Rule down the layers\" column says how a layer may change what it inherits: the safety fields only narrow, and the operational ones move either way within ",[529,2006,772],{},". Kraft refuses a layer that breaks its row's rule, and names the scope.",[779,2009,2010,2023],{},[782,2011,2012],{},[785,2013,2014,2016,2018,2021],{},[788,2015,790],{},[788,2017,793],{},[788,2019,2020],{},"Rule down the layers",[788,2022,799],{},[801,2024,2025,2048,2065,2092,2126,2143,2163,2184,2201,2219,2234],{},[785,2026,2027,2031,2033,2036],{},[806,2028,2029],{},[529,2030,1787],{},[806,2032,1025],{},[806,2034,2035],{},"Only narrows.",[806,2037,2038,2039,2042,2043,2045,2046,541],{},"Tool names the agent may use; the ",[533,2040,2041],{"href":437},"permission gate"," answers from it. Unset allows every tool, and ",[529,2044,1918],{}," allows none. See ",[533,2047,1989],{"href":1988},[785,2049,2050,2055,2057,2060],{},[806,2051,2052],{},[529,2053,2054],{},"deny_tools",[806,2056,1025],{},[806,2058,2059],{},"Only accumulates.",[806,2061,2062,2063,541],{},"Tool names the permission gate denies, on top of ",[529,2064,1787],{},[785,2066,2067,2071,2073,2076],{},[806,2068,2069],{},[529,2070,1914],{},[806,2072,1025],{},[806,2074,2075],{},"Only accumulates; an item override can drop one, never add one.",[806,2077,2078,2079,602,2082,602,2085,1211,2088,541],{},"Named git operations a task is guaranteed: ",[529,2080,2081],{},"git-commit",[529,2083,2084],{},"git-rebase",[529,2086,2087],{},"git-push",[533,2089,2091],{"href":2090},"\u002Freference\u002Fpermissions#grants","Grants",[785,2093,2094,2099,2101,2108],{},[806,2095,2096],{},[529,2097,2098],{},"sandbox",[806,2100,813],{},[806,2102,2103,2104,2107],{},"Set once, never changed or removed, its ",[529,2105,2106],{},"resources"," included.",[806,2109,2110,2111,2114,2115,2118,2119,2123,2124,541],{},"Runs every process of the whole work item in ",[529,2112,2113],{},"docker run",", within its ",[533,2116,2117],{"href":353},"resource limits",". Two scopes with different ",[533,2120,2122],{"href":2121},"\u002Fconcepts\u002Fvocabulary#sandbox","sandboxes"," are refused. See ",[533,2125,346],{"href":347},[785,2127,2128,2132,2134,2140],{},[806,2129,2130],{},[529,2131,1952],{},[806,2133,874],{},[806,2135,2136,2137,2139],{},"Within its level's ",[529,2138,772],{},"; a child's never above its parent's.",[806,2141,2142],{},"Tokens (input plus output) the scope's launches may spend before the next launch is refused.",[785,2144,2145,2149,2151,2156],{},[806,2146,2147],{},[529,2148,1955],{},[806,2150,972],{},[806,2152,2153,2154,541],{},"As ",[529,2155,1952],{},[806,2157,2158,2159,759,2161,541],{},"The same cap in dollars, under ",[529,2160,1040],{},[529,2162,1061],{},[785,2164,2165,2169,2171,2176],{},[806,2166,2167],{},[529,2168,1775],{},[806,2170,1025],{},[806,2172,2173,2174,541],{},"Within ",[529,2175,772],{},[806,2177,2178,2179,2183],{},"Harness profiles an agent task may select; Kraft refuses others at ",[533,2180,2182],{"href":2181},"\u002Fconcepts\u002Fvocabulary#intake","intake"," and again at launch.",[785,2185,2186,2190,2192,2195],{},[806,2187,2188],{},[529,2189,1778],{},[806,2191,1871],{},[806,2193,2194],{},"Any value, execution node or broader.",[806,2196,2197,2198,2200],{},"The harness profile an escalation turn runs on; a name ",[529,2199,326],{}," does not define is refused.",[785,2202,2203,2209,2211,2216],{},[806,2204,2205,602,2207],{},[529,2206,861],{},[529,2208,1770],{},[806,2210,874],{},[806,2212,2173,2213,2215],{},[529,2214,772],{},"; execution node or broader.",[806,2217,2218],{},"Bound the node's fix loop; a step, task or gate refuses them.",[785,2220,2221,2225,2227,2231],{},[806,2222,2223],{},[529,2224,1947],{},[806,2226,874],{},[806,2228,2153,2229,541],{},[529,2230,1952],{},[806,2232,2233],{},"Running time of the scope; a launch past it is refused and a running process is killed at it.",[785,2235,2236,2240,2242,2246],{},[806,2237,2238],{},[529,2239,1666],{},[806,2241,874],{},[806,2243,2153,2244,541],{},[529,2245,1947],{},[806,2247,2248],{},"Wall-clock time of the scope, including waits and gates, less only a manual pause. For a wait it is the wait's timeout.",[526,2250,2251,2252,2254,2255,2258,2259,2262,2263,2265,2266,1190,2268,541],{},"A launch into a ",[529,2253,2098],{}," with neither ",[529,2256,2257],{},"network:"," nor ",[529,2260,2261],{},"unrestricted_network: true"," is refused. Which tool policies a ",[529,2264,2098],{}," refuses depends on its ",[529,2267,2257],{},[533,2269,2271],{"href":2270},"\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fcallbacks#permission-checks-under-network","Tool policy",[1245,2273,1989],{"id":2274},"tool-lists",[526,2276,2277,759,2279,2281,2282,602,2285,2288,2289,2292,2293,2296,2297,2300,2301,2304],{},[529,2278,1787],{},[529,2280,2054],{}," hold tool names, never permission rules. Use a bare tool (",[529,2283,2284],{},"Bash",[529,2286,2287],{},"Read",") or one exact MCP tool (",[529,2290,2291],{},"mcp__kraft__report_progress","). Kraft refuses a scoped rule (",[529,2294,2295],{},"Bash(git *)","), a glob (",[529,2298,2299],{},"mcp__github__*",") or a whole server (",[529,2302,2303],{},"mcp__github",") wherever the list is read, and the message names the field and the name to write instead.",[526,2306,2307,2308,2310],{},"What a harness does under an ",[529,2309,1787],{}," list:",[779,2312,2313,2323],{},[782,2314,2315],{},[785,2316,2317,2320],{},[788,2318,2319],{},"Harness",[788,2321,2322],{},"Under a list",[801,2324,2325,2338,2356],{},[785,2326,2327,2335],{},[806,2328,2329,602,2332],{},[529,2330,2331],{},"gemini",[529,2333,2334],{},"antigravity",[806,2336,2337],{},"Refuses to launch, because it has no tool-list capability.",[785,2339,2340,2345],{},[806,2341,2342],{},[529,2343,2344],{},"codex",[806,2346,2347,2348,2351,2352,2355],{},"Enforces the list through Kraft's ",[533,2349,2350],{"href":437},"permission hook",", but its web tools never reach the hook, so a list that leaves out ",[529,2353,2354],{},"WebSearch"," is refused.",[785,2357,2358,2363],{},[806,2359,2360],{},[529,2361,2362],{},"cursor",[806,2364,2365,2366,759,2369,2355],{},"Enforces the list through the hook, but its web tools never reach it, so a list that leaves out ",[529,2367,2368],{},"WebFetch",[529,2370,2354],{},[526,2372,2373,2374,2376,2377,602,2380,602,2383,2386,2387,2390],{},"Allowing ",[529,2375,2284],{}," allows its read-only use without a gate ask. Claude runs a read-only shell command (",[529,2378,2379],{},"cat",[529,2381,2382],{},"ls",[529,2384,2385],{},"git status",") itself, so it can read any file the ",[533,2388,2389],{"href":1256},"worktree"," holds, gitignored ones included.",[774,2392,2394],{"id":2393},"related","Related",[1321,2396,2397,2402,2407],{},[1324,2398,2399,2401],{},[533,2400,40],{"href":41},": how caps, maxima and layers combine.",[1324,2403,2404,2406],{},[533,2405,436],{"href":437},": how tool lists and grants are enforced.",[1324,2408,2409,2411,2412,541],{},[533,2410,392],{"href":393},": where a chain, node, step or task sets its own ",[529,2413,2000],{},[2415,2416,2417],"style",{},"html pre.shiki code .sb7M8, html code.shiki .sb7M8{--shiki-light:#024C1A;--shiki-default:#024C1A;--shiki-dark:#72F088}html pre.shiki code .s7iLA, html code.shiki .s7iLA{--shiki-light:#0E1116;--shiki-default:#0E1116;--shiki-dark:#F0F3F6}html pre.shiki code .ssYy9, html code.shiki .ssYy9{--shiki-light:#023B95;--shiki-default:#023B95;--shiki-dark:#91CBFF}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 .sq92B, html code.shiki .sq92B{--shiki-light:#66707B;--shiki-default:#66707B;--shiki-dark:#BDC4CC}",{"title":565,"searchDepth":583,"depth":583,"links":2419},[2420,2426,2428,2431],{"id":776,"depth":583,"text":2421,"children":2422},"Top-​level keys",[2423,2424,2425],{"id":1247,"depth":616,"text":1129},{"id":1519,"depth":616,"text":828},{"id":1614,"depth":616,"text":1194},{"id":1681,"depth":583,"text":2427},"defaults and maxima",{"id":1993,"depth":583,"text":1994,"children":2429},[2430],{"id":2274,"depth":616,"text":1989},{"id":2393,"depth":583,"text":2394},"Every field in policy.yaml: caps, budget, concurrency, archiving, defaults and maxima, and the policy fields a layer may set.","md",null,{},{"title":318,"description":2432},"o_pcMxwyrm-dlbTTwcrk0RmAybQWVRawIzWH9Di6oFM",[2439,2441],{"title":314,"path":315,"stem":316,"description":2440,"children":-1},"Declare a root repository with member submodules in repos.yaml, and what it means for sandboxing and publication.",{"title":322,"path":323,"stem":324,"description":2442,"children":-1},"The sections of library.yaml, the keys a library task takes for each kind, and how chains\u002F*.yaml files compose them into chain templates.",1791801174024]