[{"data":1,"prerenderedAt":1434},["ShallowReactive",2],{"navigation_docs":3,"-reference-configuration-policy":270,"-reference-configuration-policy-surround":1429},[4,28,51,110,243],{"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},"Troubleshooting and FAQ","\u002Fget-started\u002Ftroubleshooting","1.get-started\u002F3.troubleshooting",{"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},"Vocabulary","\u002Fconcepts\u002Fvocabulary","2.concepts\u002F1.vocabulary",{"title":40,"path":41,"stem":42},"How a work item runs","\u002Fconcepts\u002Fhow-a-work-item-runs","2.concepts\u002F2.how-a-work-item-runs",{"title":44,"path":45,"stem":46},"Caps and budgets","\u002Fconcepts\u002Fcaps-and-budgets","2.concepts\u002F3.caps-and-budgets",{"title":48,"path":49,"stem":50},"Why a permission gate","\u002Fconcepts\u002Fpermission-gate","2.concepts\u002F4.permission-gate",{"title":52,"path":53,"stem":54,"children":55},"Guides","\u002Fguides","3.guides",[56,58,62,66,70,74,78,82,86,90,94,98,102,106],{"title":10,"path":53,"stem":57},"3.guides\u002Findex",{"title":59,"path":60,"stem":61},"Use Kraft from your agent","\u002Fguides\u002Fagent-integration","3.guides\u002F01.agent-integration",{"title":63,"path":64,"stem":65},"Kraft Lite","\u002Fguides\u002Fkraft-lite","3.guides\u002F02.kraft-lite",{"title":67,"path":68,"stem":69},"Remote access","\u002Fguides\u002Fremote-access","3.guides\u002F03.remote-access",{"title":71,"path":72,"stem":73},"Add or override a harness","\u002Fguides\u002Fadding-a-harness","3.guides\u002F04.adding-a-harness",{"title":75,"path":76,"stem":77},"Schedule or webhook work","\u002Fguides\u002Fschedule-and-webhook-work","3.guides\u002F05.schedule-and-webhook-work",{"title":79,"path":80,"stem":81},"Add a security review or a gate reviewer","\u002Fguides\u002Fadd-review-agents","3.guides\u002F06.add-review-agents",{"title":83,"path":84,"stem":85},"Kraft for VS Code","\u002Fguides\u002Fvscode","3.guides\u002F07.vscode",{"title":87,"path":88,"stem":89},"Reviewing a change","\u002Fguides\u002Freview-a-change","3.guides\u002F08.review-a-change",{"title":91,"path":92,"stem":93},"Write your own chain","\u002Fguides\u002Fwrite-your-own-chain","3.guides\u002F09.write-your-own-chain",{"title":95,"path":96,"stem":97},"Switch a harness","\u002Fguides\u002Fswitch-harness","3.guides\u002F10.switch-harness",{"title":99,"path":100,"stem":101},"Upgrade your templates","\u002Fguides\u002Fupgrading-templates","3.guides\u002F11.upgrading-templates",{"title":103,"path":104,"stem":105},"Operations","\u002Fguides\u002Foperations","3.guides\u002F12.operations",{"title":107,"path":108,"stem":109},"Worker Kit","\u002Fguides\u002Fworker-kit","3.guides\u002F13.worker-kit",{"title":111,"path":112,"stem":113,"children":114},"Reference","\u002Freference","4.reference",[115,117,139,183,201,205,227,231,235,239],{"title":10,"path":112,"stem":116},"4.reference\u002Findex",{"title":118,"path":119,"stem":120,"children":121},"CLI","\u002Freference\u002Fcli","4.reference\u002F1.cli\u002Findex",[122,123,127,131,135],{"title":10,"path":119,"stem":120},{"title":124,"path":125,"stem":126},"Item verbs","\u002Freference\u002Fcli\u002Fitem","4.reference\u002F1.cli\u002F2.item",{"title":128,"path":129,"stem":130},"View verbs","\u002Freference\u002Fcli\u002Fview","4.reference\u002F1.cli\u002F3.view",{"title":132,"path":133,"stem":134},"Repo verbs","\u002Freference\u002Fcli\u002Frepo","4.reference\u002F1.cli\u002F4.repo",{"title":136,"path":137,"stem":138},"Admin verbs","\u002Freference\u002Fcli\u002Fadmin","4.reference\u002F1.cli\u002F5.admin",{"title":140,"path":141,"stem":142,"children":143},"Configuration","\u002Freference\u002Fconfiguration","4.reference\u002F2.configuration\u002Findex",[144,145,155,159,163,167,171,175,179],{"title":10,"path":141,"stem":142},{"title":146,"path":147,"stem":148,"children":149},"Repos","\u002Freference\u002Fconfiguration\u002Frepos","4.reference\u002F2.configuration\u002F2.repos\u002Findex",[150,151],{"title":10,"path":147,"stem":148},{"title":152,"path":153,"stem":154},"Workspaces","\u002Freference\u002Fconfiguration\u002Frepos\u002Fworkspaces","4.reference\u002F2.configuration\u002F2.repos\u002F3.workspaces",{"title":156,"path":157,"stem":158},"Policy","\u002Freference\u002Fconfiguration\u002Fpolicy","4.reference\u002F2.configuration\u002F3.policy",{"title":160,"path":161,"stem":162},"Library and chains","\u002Freference\u002Fconfiguration\u002Flibrary-and-chains","4.reference\u002F2.configuration\u002F4.library-and-chains",{"title":164,"path":165,"stem":166},"Harnesses file","\u002Freference\u002Fconfiguration\u002Fharnesses-file","4.reference\u002F2.configuration\u002F5.harnesses-file",{"title":168,"path":169,"stem":170},"Access","\u002Freference\u002Fconfiguration\u002Faccess","4.reference\u002F2.configuration\u002F6.access",{"title":172,"path":173,"stem":174},"Intake","\u002Freference\u002Fconfiguration\u002Fintake","4.reference\u002F2.configuration\u002F7.intake",{"title":176,"path":177,"stem":178},"Sandbox host","\u002Freference\u002Fconfiguration\u002Fsandbox","4.reference\u002F2.configuration\u002F8.sandbox",{"title":180,"path":181,"stem":182},"Environment variables","\u002Freference\u002Fconfiguration\u002Fenvironment-variables","4.reference\u002F2.configuration\u002F9.environment-variables",{"title":184,"path":185,"stem":186,"children":187},"Chain nodes","\u002Freference\u002Fchain-nodes","4.reference\u002F3.chain-nodes\u002Findex",[188,189,193,197],{"title":10,"path":185,"stem":186},{"title":190,"path":191,"stem":192},"Subprocess tasks","\u002Freference\u002Fchain-nodes\u002Fsubprocess-tasks","4.reference\u002F3.chain-nodes\u002F2.subprocess-tasks",{"title":194,"path":195,"stem":196},"Fix loop and judge","\u002Freference\u002Fchain-nodes\u002Ffix-loop","4.reference\u002F3.chain-nodes\u002F3.fix-loop",{"title":198,"path":199,"stem":200},"Result file","\u002Freference\u002Fchain-nodes\u002Fresult-file","4.reference\u002F3.chain-nodes\u002F4.result-file",{"title":202,"path":203,"stem":204},"Permission gate","\u002Freference\u002Fpermissions","4.reference\u002F4.permissions",{"title":206,"path":207,"stem":208,"children":209},"Agent harnesses","\u002Freference\u002Fharnesses","4.reference\u002F5.harnesses\u002Findex",[210,211,215,219,223],{"title":10,"path":207,"stem":208},{"title":212,"path":213,"stem":214},"Unattended runs","\u002Freference\u002Fharnesses\u002Funattended-runs","4.reference\u002F5.harnesses\u002F2.unattended-runs",{"title":216,"path":217,"stem":218},"Agent profiles","\u002Freference\u002Fharnesses\u002Fagent-profiles","4.reference\u002F5.harnesses\u002F3.agent-profiles",{"title":220,"path":221,"stem":222},"Harness files","\u002Freference\u002Fharnesses\u002Fharness-files","4.reference\u002F5.harnesses\u002F4.harness-files",{"title":224,"path":225,"stem":226},"Fallback and escalation","\u002Freference\u002Fharnesses\u002Ffallback-and-escalation","4.reference\u002F5.harnesses\u002F5.fallback-and-escalation",{"title":228,"path":229,"stem":230},"Inbound triggers","\u002Freference\u002Ftriggers","4.reference\u002F6.triggers",{"title":232,"path":233,"stem":234},"HTTP API","\u002Freference\u002Fhttp-api","4.reference\u002F7.http-api",{"title":236,"path":237,"stem":238},"MCP tools","\u002Freference\u002Fmcp-tools","4.reference\u002F8.mcp-tools",{"title":240,"path":241,"stem":242},"Events","\u002Freference\u002Fevents","4.reference\u002F9.events",{"title":244,"path":245,"stem":246,"children":247},"Project","\u002Fproject","5.project",[248,250,254,258,262,266],{"title":10,"path":245,"stem":249},"5.project\u002Findex",{"title":251,"path":252,"stem":253},"Architecture","\u002Fproject\u002Farchitecture","5.project\u002F1.architecture",{"title":255,"path":256,"stem":257},"Contributing","\u002Fproject\u002Fcontributing","5.project\u002F2.contributing",{"title":259,"path":260,"stem":261},"Security","\u002Fproject\u002Fsecurity","5.project\u002F3.security",{"title":263,"path":264,"stem":265},"Data and privacy","\u002Fproject\u002Fdata-and-privacy","5.project\u002F4.data-and-privacy",{"title":267,"path":268,"stem":269},"Status and support","\u002Fproject\u002Fstatus-and-support","5.project\u002F5.status-and-support",{"id":271,"title":156,"body":272,"description":1423,"extension":1424,"links":1425,"meta":1426,"navigation":369,"path":157,"seo":1427,"stem":158,"__hash__":1428},"docs\u002F4.reference\u002F2.configuration\u002F3.policy.md",{"type":273,"value":274,"toc":1417},"minimark",[275,283,290,296,302,305,489,504,614,636,641,964,970,977,1094,1114,1118,1329,1359,1405,1413],[276,277,278,282],"p",{},[279,280,281],"code",{},"policy.yaml"," sets caps, budget, archiving, and defaults for every work item.",[276,284,285,286,289],{},"It lives at ",[279,287,288],{},"$KRAFT_HOME\u002Ftemplates\u002Fpolicy.yaml",".",[276,291,292,295],{},[279,293,294],{},"kraft admin reload"," rereads this file with the same validation as startup. If\nthe file does not validate, Kraft keeps the running policy and reload exits 1\nnaming why. New loop caps apply to loops that start after the reload.",[276,297,298,299,289],{},"For how caps, maxima and layers combine, see\n",[300,301,44],"a",{"href":45},[276,303,304],{},"The shipped file sets these keys:",[306,307,312],"pre",{"className":308,"code":309,"language":310,"meta":311,"style":311},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","loops: {}\ndefault: { attempts: 3, wall_clock_s: 3600 }\n\nfindings:\n  loop_severities: [critical, important]\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","yaml","",[279,313,314,330,364,371,380,403,408,416,427,438,443,454,465,470,478],{"__ignoreMap":311},[315,316,319,323,327],"span",{"class":317,"line":318},"line",1,[315,320,322],{"class":321},"swJcz","loops",[315,324,326],{"class":325},"sMK4o",":",[315,328,329],{"class":325}," {}\n",[315,331,333,336,338,341,344,346,350,353,356,358,361],{"class":317,"line":332},2,[315,334,335],{"class":321},"default",[315,337,326],{"class":325},[315,339,340],{"class":325}," {",[315,342,343],{"class":321}," attempts",[315,345,326],{"class":325},[315,347,349],{"class":348},"sbssI"," 3",[315,351,352],{"class":325},",",[315,354,355],{"class":321}," wall_clock_s",[315,357,326],{"class":325},[315,359,360],{"class":348}," 3600",[315,362,363],{"class":325}," }\n",[315,365,367],{"class":317,"line":366},3,[315,368,370],{"emptyLinePlaceholder":369},true,"\n",[315,372,374,377],{"class":317,"line":373},4,[315,375,376],{"class":321},"findings",[315,378,379],{"class":325},":\n",[315,381,383,386,388,391,395,397,400],{"class":317,"line":382},5,[315,384,385],{"class":321},"  loop_severities",[315,387,326],{"class":325},[315,389,390],{"class":325}," [",[315,392,394],{"class":393},"sfazB","critical",[315,396,352],{"class":325},[315,398,399],{"class":393}," important",[315,401,402],{"class":325},"]\n",[315,404,406],{"class":317,"line":405},6,[315,407,370],{"emptyLinePlaceholder":369},[315,409,411,414],{"class":317,"line":410},7,[315,412,413],{"class":321},"budget",[315,415,379],{"class":325},[315,417,419,422,424],{"class":317,"line":418},8,[315,420,421],{"class":321},"  work_item_usd",[315,423,326],{"class":325},[315,425,426],{"class":348}," 10\n",[315,428,430,433,435],{"class":317,"line":429},9,[315,431,432],{"class":321},"  daily_usd",[315,434,326],{"class":325},[315,436,437],{"class":348}," 50\n",[315,439,441],{"class":317,"line":440},10,[315,442,370],{"emptyLinePlaceholder":369},[315,444,446,449,451],{"class":317,"line":445},11,[315,447,448],{"class":321},"rate_limit_retries",[315,450,326],{"class":325},[315,452,453],{"class":348}," 5\n",[315,455,457,460,462],{"class":317,"line":456},12,[315,458,459],{"class":321},"forge_cli_timeout_s",[315,461,326],{"class":325},[315,463,464],{"class":348}," 120\n",[315,466,468],{"class":317,"line":467},13,[315,469,370],{"emptyLinePlaceholder":369},[315,471,473,476],{"class":317,"line":472},14,[315,474,475],{"class":321},"archive",[315,477,379],{"class":325},[315,479,481,484,486],{"class":317,"line":480},15,[315,482,483],{"class":321},"  after_days",[315,485,326],{"class":325},[315,487,488],{"class":348}," 30\n",[276,490,491,492,495,496,499,500,503],{},"The shipped file also holds ",[279,493,494],{},"triggers:",", ",[279,497,498],{},"defaults:"," and ",[279,501,502],{},"maxima:"," as\ncomments. Kraft ships them commented out because an uncommented value is a\nreal ceiling. This example is illustrative. Uncomment and edit it to use it:",[306,505,507],{"className":308,"code":506,"language":310,"meta":311,"style":311},"# triggers:\n#   - cron: \"0 9 * * 1,2,3,4,5\"\n#     repo: \u002Fpath\u002Fto\u002Frepo\n#     chain: default\n#     title: \"Weekday dependency check\"\n#\n# 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",[279,508,509,515,520,525,530,535,540,545,550,555,560,565,570,575,580,585,591,597,602,608],{"__ignoreMap":311},[315,510,511],{"class":317,"line":318},[315,512,514],{"class":513},"sHwdD","# triggers:\n",[315,516,517],{"class":317,"line":332},[315,518,519],{"class":513},"#   - cron: \"0 9 * * 1,2,3,4,5\"\n",[315,521,522],{"class":317,"line":366},[315,523,524],{"class":513},"#     repo: \u002Fpath\u002Fto\u002Frepo\n",[315,526,527],{"class":317,"line":373},[315,528,529],{"class":513},"#     chain: default\n",[315,531,532],{"class":317,"line":382},[315,533,534],{"class":513},"#     title: \"Weekday dependency check\"\n",[315,536,537],{"class":317,"line":405},[315,538,539],{"class":513},"#\n",[315,541,542],{"class":317,"line":410},[315,543,544],{"class":513},"# defaults:\n",[315,546,547],{"class":317,"line":418},[315,548,549],{"class":513},"#   timeout_minutes: 60\n",[315,551,552],{"class":317,"line":429},[315,553,554],{"class":513},"#   max_attempts: 3\n",[315,556,557],{"class":317,"line":440},[315,558,559],{"class":513},"#   allowed_harnesses: [codex, claude]\n",[315,561,562],{"class":317,"line":445},[315,563,564],{"class":513},"#   escalation_harness: claude\n",[315,566,567],{"class":317,"line":456},[315,568,569],{"class":513},"#   work_item: { time_cap_minutes: 480, total_time_cap_minutes: 2880, budget_usd: 20 }\n",[315,571,572],{"class":317,"line":467},[315,573,574],{"class":513},"#   nodes:     { time_cap_minutes: 180 }\n",[315,576,577],{"class":317,"line":472},[315,578,579],{"class":513},"#   steps:     { time_cap_minutes: 120 }\n",[315,581,582],{"class":317,"line":480},[315,583,584],{"class":513},"#   tasks:     { time_cap_minutes: 90 }\n",[315,586,588],{"class":317,"line":587},16,[315,589,590],{"class":513},"# maxima:\n",[315,592,594],{"class":317,"line":593},17,[315,595,596],{"class":513},"#   timeout_minutes: 180\n",[315,598,600],{"class":317,"line":599},18,[315,601,559],{"class":513},[315,603,605],{"class":317,"line":604},19,[315,606,607],{"class":513},"#   work_item: { time_cap_minutes: 1440, token_budget: 2000000, budget_usd: 25 }\n",[315,609,611],{"class":317,"line":610},20,[315,612,613],{"class":513},"#   tasks:     { time_cap_minutes: 240, total_time_cap_minutes: 10080 }\n",[276,615,616,617,620,621,624,625,628,629,499,632,635],{},"Do not set ",[279,618,619],{},"maxima.allowed_tools"," unless every harness you use can run under\nit. A safety field set only in ",[279,622,623],{},"maxima"," binds every task. ",[279,626,627],{},"gemini"," refuses to\nlaunch under any tool list, and ",[279,630,631],{},"codex",[279,633,634],{},"cursor"," refuse a list that leaves\nout the web tools their permission hook never sees.",[637,638,640],"h2",{"id":639},"top-level-keys","Top-level keys",[642,643,644,660],"table",{},[645,646,647],"thead",{},[648,649,650,654,657],"tr",{},[651,652,653],"th",{},"Key",[651,655,656],{},"Default",[651,658,659],{},"Effect",[661,662,663,684,718,733,752,766,781,796,820,835,855,872,886,902,916,946],"tbody",{},[648,664,665,671,674],{},[666,667,668],"td",{},[279,669,670],{},"loops.\u003Cname>",[666,672,673],{},"none",[666,675,676,677,499,680,683],{},"Sets ",[279,678,679],{},"attempts",[279,681,682],{},"wall_clock_s"," for one named loop; a key that names no live loop is silently unused.",[648,685,686,690,700],{},[666,687,688],{},[279,689,335],{},[666,691,692,696,697],{},[693,694,695],"em",{},"(required)","; the shipped file sets ",[279,698,699],{},"{attempts: 3, wall_clock_s: 3600}",[666,701,702,703,499,705,707,708,710,711,714,715,717],{},"The ",[279,704,679],{},[279,706,682],{}," ceiling for every fix loop not named in ",[279,709,322],{},"; a ",[279,712,713],{},"max_attempts"," on the loop itself wins. Without it ",[279,716,281],{}," does not load, and Kraft refuses new work.",[648,719,720,725,730],{},[666,721,722],{},[279,723,724],{},"max_concurrent",[666,726,727],{},[279,728,729],{},"3",[666,731,732],{},"How many work items may be active at once across all repos, however they were started.",[648,734,735,740,745],{},[666,736,737],{},[279,738,739],{},"auto_escalate_stuck",[666,741,742],{},[279,743,744],{},"true",[666,746,747,748,751],{},"Whether a stuck stop auto-dispatches an escalation turn on a node that declares no ",[279,749,750],{},"escalation"," of its own.",[648,753,754,759,763],{},[666,755,756],{},[279,757,758],{},"auto_escalate_stuck_cap",[666,760,761],{},[279,762,729],{},[666,764,765],{},"How many times one stuck run is auto-escalated before it is left for a human.",[648,767,768,773,778],{},[666,769,770],{},[279,771,772],{},"auto_escalate_delay_s",[666,774,775],{},[279,776,777],{},"0",[666,779,780],{},"Seconds to wait after the triggering event before an auto-escalation fires, so a human about to look is not preempted.",[648,782,783,788,793],{},[666,784,785],{},[279,786,787],{},"auto_review_attempts",[666,789,790],{},[279,791,792],{},"1",[666,794,795],{},"How many automated-review attempts one pending gate may spend before it is left to a human.",[648,797,798,802,807],{},[666,799,800],{},[279,801,459],{},[666,803,804],{},[279,805,806],{},"120",[666,808,809,810,495,813,495,816,819],{},"Seconds one forge CLI call (",[279,811,812],{},"gh",[279,814,815],{},"glab",[279,817,818],{},"git",") may run before Kraft kills it and reports a forge error; read at startup.",[648,821,822,827,832],{},[666,823,824],{},[279,825,826],{},"findings.loop_severities",[666,828,829],{},[279,830,831],{},"[critical, important]",[666,833,834],{},"Which review-finding severities burn a fix cycle; lower ones are recorded and shown at the human-review gate.",[648,836,837,842,852],{},[666,838,839],{},[279,840,841],{},"budget.work_item_usd",[666,843,844,845,848,849],{},"off (",[279,846,847],{},"null","); shipped file sets ",[279,850,851],{},"10",[666,853,854],{},"Dollar cap per work item across all its loops; remove the key to turn it off.",[648,856,857,862,869],{},[666,858,859],{},[279,860,861],{},"budget.daily_usd",[666,863,844,864,848,866],{},[279,865,847],{},[279,867,868],{},"50",[666,870,871],{},"Dollar cap for every work item on this instance since local midnight; remove the key to turn it off.",[648,873,874,878,883],{},[666,875,876],{},[279,877,448],{},[666,879,880],{},[279,881,882],{},"5",[666,884,885],{},"How many times Kraft relaunches a work item after a rejected API rate limit before stopping for a human.",[648,887,888,893,899],{},[666,889,890],{},[279,891,892],{},"archive.after_days",[666,894,895,896],{},"off if the key is absent; shipped file sets ",[279,897,898],{},"30",[666,900,901],{},"Completed and abandoned items older than this auto-archive; keep it in sync with the number the board's Done header shows.",[648,903,904,909,911],{},[666,905,906],{},[279,907,908],{},"triggers",[666,910,673],{},[666,912,913,914,289],{},"Cron-fired chain starts; see ",[300,915,228],{"href":229},[648,917,918,923,926],{},[666,919,920],{},[279,921,922],{},"defaults",[666,924,925],{},"unset",[666,927,928,929,495,932,495,934,495,937,495,940,943,944,289],{},"Starting points for ",[279,930,931],{},"timeout_minutes",[279,933,713],{},[279,935,936],{},"allowed_harnesses",[279,938,939],{},"escalation_harness",[279,941,942],{},"escalation_grants"," and the per-level caps; any scope may move them within ",[279,945,623],{},[648,947,948,952,955],{},[666,949,950],{},[279,951,623],{},[666,953,954],{},"unset (no bound)",[666,956,957,958,960,961,289],{},"The administrator ceiling on policy overrides, with the same keys as ",[279,959,922],{}," plus ",[279,962,963],{},"allowed_tools",[276,965,966,967,289],{},"A budget cap refuses to start the next agent task and cannot interrupt one\nthat is running. See ",[300,968,44],{"href":969},"\u002Fconcepts\u002Fcaps-and-budgets#token-and-dollar-budgets",[637,971,973,499,975],{"id":972},"defaults-and-maxima",[279,974,922],{},[279,976,623],{},[642,978,979,987],{},[645,980,981],{},[648,982,983,985],{},[651,984,653],{},[651,986,659],{},[661,988,989,1004,1023,1053,1085],{},[648,990,991,999],{},[666,992,993,495,995,495,997],{},[279,994,931],{},[279,996,713],{},[279,998,936],{},[666,1000,1001,1002,289],{},"Operational starting points that any layer may move in either direction, bounded only by ",[279,1003,623],{},[648,1005,1006,1010],{},[666,1007,1008],{},[279,1009,939],{},[666,1011,702,1012,1015,1016,1019,1020,289],{},[279,1013,1014],{},"harnesses.yaml"," profile an escalation turn runs on, or ",[279,1017,1018],{},"item","; unset is ",[279,1021,1022],{},"claude",[648,1024,1025,1029],{},[666,1026,1027],{},[279,1028,942],{},[666,1030,702,1031,1035,1036,495,1039,499,1042,1045,1046,1049,1050,1052],{},[300,1032,1034],{"href":1033},"\u002Freference\u002Fpermissions#grants","grants"," every escalation turn holds; unset is ",[279,1037,1038],{},"git-commit",[279,1040,1041],{},"git-rebase",[279,1043,1044],{},"git-push",", and ",[279,1047,1048],{},"[]"," is none. Set it in ",[279,1051,922],{}," only.",[648,1054,1055,1069],{},[666,1056,1057,495,1060,495,1063,495,1066],{},[279,1058,1059],{},"work_item",[279,1061,1062],{},"nodes",[279,1064,1065],{},"steps",[279,1067,1068],{},"tasks",[666,1070,1071,1072,495,1075,495,1078,499,1081,1084],{},"Per-level values for ",[279,1073,1074],{},"time_cap_minutes",[279,1076,1077],{},"total_time_cap_minutes",[279,1079,1080],{},"token_budget",[279,1082,1083],{},"budget_usd","; a gate is a node. Unset means unbounded.",[648,1086,1087,1091],{},[666,1088,1089],{},[279,1090,619],{},[666,1092,1093],{},"A safety field that starts at its maximum and can only be narrowed.",[276,1095,1096,1097,1099,1100,1099,1102,1099,1104,1106,1107,1109,1110,1113],{},"A narrower level's cap may not exceed a broader one's\n(",[279,1098,1068],{}," \u003C= ",[279,1101,1065],{},[279,1103,1062],{},[279,1105,1059],{},"). A ",[279,1108,922],{}," entry may not\nexceed its level's maximum. Kraft refuses either when it reads the file,\nnaming both. A cap written flat (",[279,1111,1112],{},"defaults: time_cap_minutes: 30",") is refused\ntoo, with a message naming the level form to use.",[637,1115,1117],{"id":1116},"policy-fields","Policy fields",[642,1119,1120,1132],{},[645,1121,1122],{},[648,1123,1124,1127,1130],{},[651,1125,1126],{},"Field",[651,1128,1129],{},"Rule down the layers",[651,1131,659],{},[661,1133,1134,1153,1168,1190,1220,1235,1253,1272,1287,1303,1316],{},[648,1135,1136,1140,1143],{},[666,1137,1138],{},[279,1139,963],{},[666,1141,1142],{},"Only narrows.",[666,1144,1145,1146,1149,1150,1152],{},"Lists tool names the agent may use; the ",[300,1147,1148],{"href":203},"permission gate"," answers from it, and unset allows every tool while ",[279,1151,1048],{}," allows none.",[648,1154,1155,1160,1163],{},[666,1156,1157],{},[279,1158,1159],{},"deny_tools",[666,1161,1162],{},"Only accumulates.",[666,1164,1165,1166,289],{},"Tool names the permission gate denies, on top of ",[279,1167,963],{},[648,1169,1170,1174,1177],{},[666,1171,1172],{},[279,1173,1034],{},[666,1175,1176],{},"Only accumulates; an item override can drop one, never add one.",[666,1178,1179,1180,495,1182,495,1184,1186,1187,289],{},"Named git operations a task is guaranteed: ",[279,1181,1038],{},[279,1183,1041],{},[279,1185,1044],{},". See ",[300,1188,1189],{"href":1033},"Grants",[648,1191,1192,1197,1204],{},[666,1193,1194],{},[279,1195,1196],{},"sandbox",[666,1198,1199,1200,1203],{},"Set once, never changed or removed, its ",[279,1201,1202],{},"resources"," included.",[666,1205,1206,1207,1210,1211,1215,1216,289],{},"Runs every process of the whole work item in ",[279,1208,1209],{},"docker run",", within its ",[300,1212,1214],{"href":1213},"\u002Freference\u002Fconfiguration\u002Frepos#resource-limits","resource limits","; two scopes with different sandboxes are refused. A tool policy that needs Kraft's permission hook (Cursor, Codex) is refused under it. See ",[300,1217,1219],{"href":1218},"\u002Freference\u002Fconfiguration\u002Frepos#sandboxed-workers","Sandboxed workers",[648,1221,1222,1226,1232],{},[666,1223,1224],{},[279,1225,1080],{},[666,1227,1228,1229,1231],{},"Within its level's ",[279,1230,623],{},"; a child's never above its parent's.",[666,1233,1234],{},"Tokens (input plus output) the scope's launches may spend before the next launch is refused.",[648,1236,1237,1241,1246],{},[666,1238,1239],{},[279,1240,1083],{},[666,1242,1243,1244,289],{},"As ",[279,1245,1080],{},[666,1247,1248,1249,499,1251,289],{},"The same cap in dollars, under ",[279,1250,841],{},[279,1252,861],{},[648,1254,1255,1259,1264],{},[666,1256,1257],{},[279,1258,936],{},[666,1260,1261,1262,289],{},"Within ",[279,1263,623],{},[666,1265,1266,1267,1271],{},"Profiles an agent task may select; Kraft refuses others at ",[300,1268,1270],{"href":1269},"\u002Fconcepts\u002Fvocabulary#intake","intake"," and again at launch.",[648,1273,1274,1278,1281],{},[666,1275,1276],{},[279,1277,939],{},[666,1279,1280],{},"Any value, execution node or broader.",[666,1282,1283,1284,1286],{},"The profile an escalation turn runs on; a name ",[279,1285,1014],{}," does not define is refused.",[648,1288,1289,1295,1300],{},[666,1290,1291,495,1293],{},[279,1292,713],{},[279,1294,931],{},[666,1296,1261,1297,1299],{},[279,1298,623],{},"; execution node or broader.",[666,1301,1302],{},"Bound the node's fix loop; a step, task or gate refuses them.",[648,1304,1305,1309,1313],{},[666,1306,1307],{},[279,1308,1074],{},[666,1310,1243,1311,289],{},[279,1312,1080],{},[666,1314,1315],{},"Running time of the scope; a launch past it is refused and a running process is killed at it.",[648,1317,1318,1322,1326],{},[666,1319,1320],{},[279,1321,1077],{},[666,1323,1243,1324,289],{},[279,1325,1074],{},[666,1327,1328],{},"Wall-clock time of the scope, including waits and gates, less only a manual pause; for a wait it is the wait's timeout.",[276,1330,1331,499,1333,1335,1336,495,1339,1342,1343,1346,1347,1350,1351,1354,1355,1358],{},[279,1332,963],{},[279,1334,1159],{}," hold tool names, never permission rules. Use a\nbare tool (",[279,1337,1338],{},"Bash",[279,1340,1341],{},"Read",") or one exact MCP tool (",[279,1344,1345],{},"mcp__kraft__report_progress",").\nKraft refuses a scoped rule (",[279,1348,1349],{},"Bash(git *)","), a glob (",[279,1352,1353],{},"mcp__github__*",") or a\nwhole server (",[279,1356,1357],{},"mcp__github",") wherever the list is read, and the message names\nthe field and the name to write instead.",[276,1360,1361,1362,1364,1365,1367,1368,499,1370,1372,1373,1376,1377,1380,1381,1383,1384,499,1387,1380,1389,1391,1392,1394,1395,495,1398,495,1401,1404],{},"A harness with no tool-list capability (",[279,1363,627],{},") refuses to launch under an\n",[279,1366,963],{}," list rather than run unrestricted. ",[279,1369,631],{},[279,1371,634],{}," enforce\nthe list through Kraft's ",[300,1374,1375],{"href":203},"permission hook",", but their\nweb tools never reach the hook, so they refuse a list that leaves out\n",[279,1378,1379],{},"WebSearch"," (",[279,1382,631],{},") or ",[279,1385,1386],{},"WebFetch",[279,1388,1379],{},[279,1390,634],{},"). Allowing ",[279,1393,1338],{},"\nallows its read-only use without a gate ask. Claude runs a read-only shell\ncommand (",[279,1396,1397],{},"cat",[279,1399,1400],{},"ls",[279,1402,1403],{},"git status",") itself, so it can read any file the\nworktree holds, gitignored ones included.",[276,1406,1407,1410,1411,289],{},[279,1408,1409],{},"wait_timeout_minutes"," is retired. Kraft refuses it and names\n",[279,1412,1077],{},[1414,1415,1416],"style",{},"html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":311,"searchDepth":332,"depth":332,"links":1418},[1419,1420,1422],{"id":639,"depth":332,"text":640},{"id":972,"depth":332,"text":1421},"defaults and maxima",{"id":1116,"depth":332,"text":1117},"Every field in policy.yaml: caps, budget, archiving, defaults, maxima, and triggers.","md",null,{},{"title":156,"description":1423},"IBoiB3R6YmM5mCkt6z6eBPeoU5xSxpbGgcX5duX-KAg",[1430,1432],{"title":152,"path":153,"stem":154,"description":1431,"children":-1},"Declare a root repository with member submodules in repos.yaml, and what it means for sandboxing and publication.",{"title":160,"path":161,"stem":162,"description":1433,"children":-1},"Every field in library.yaml and chains\u002F*.yaml: reusable components and chain templates.",1790824543386]