[{"data":1,"prerenderedAt":1609},["ShallowReactive",2],{"navigation_docs":3,"-reference-chain-nodes":270,"-reference-chain-nodes-surround":1604},[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":184,"body":272,"description":1597,"extension":1598,"links":1599,"meta":1600,"navigation":1601,"path":185,"seo":1602,"stem":186,"__hash__":1603},"docs\u002F4.reference\u002F3.chain-nodes\u002Findex.md",{"type":273,"value":274,"toc":1581},"minimark",[275,291,296,319,323,375,379,382,475,480,491,615,647,651,723,727,808,812,815,952,958,962,968,1157,1161,1311,1313,1318,1378,1382,1401,1422,1551,1555,1577],[276,277,278,279,283,284,287,288,290],"p",{},"The keys a chain file under ",[280,281,282],"code",{},"templates\u002Fchains\u002F"," accepts, and the keys of every\ntask kind. For what a chain, node, task, and gate are, see\n",[285,286,29],"a",{"href":37},". For the reusable components a chain extends,\nsee ",[285,289,160],{"href":161},".",[292,293,295],"h2",{"id":294},"in-this-section","In this section",[297,298,299,305,310],"ul",{},[300,301,302,304],"li",{},[285,303,190],{"href":191},": what Kraft passes a command, and how its exit code becomes a status.",[300,306,307,309],{},[285,308,194],{"href":195},": when a fix loop opens, what each cycle does, and what the judge's verdicts mean.",[300,311,312,314,315,318],{},[285,313,198],{"href":199},": the JSON a task writes at ",[280,316,317],{},"$KRAFT_RESULT_PATH",", field by field.",[292,320,322],{"id":321},"chain-keys","Chain keys",[324,325,326,339],"table",{},[327,328,329],"thead",{},[330,331,332,336],"tr",{},[333,334,335],"th",{},"Key",[333,337,338],{},"Meaning",[340,341,342,353,363],"tbody",{},[330,343,344,350],{},[345,346,347],"td",{},[280,348,349],{},"id",[345,351,352],{},"The chain's name. Defaults to the file name.",[330,354,355,360],{},[345,356,357],{},[280,358,359],{},"nodes",[345,361,362],{},"The ordered list of nodes. At least one.",[330,364,365,370],{},[345,366,367],{},[280,368,369],{},"policy",[345,371,372,373,290],{},"The chain's layer of the ",[285,374,369],{"href":157},[292,376,378],{"id":377},"node-keys","Node keys",[276,380,381],{},"Every node takes these keys, then the keys of its kind.",[324,383,384,392],{},[327,385,386],{},[330,387,388,390],{},[333,389,335],{},[333,391,338],{},[340,393,394,407,424,439,451],{},[330,395,396,400],{},[345,397,398],{},[280,399,349],{},[345,401,402,403,406],{},"The node's name (",[280,404,405],{},"[a-z][a-z0-9_-]*","), unique in the chain.",[330,408,409,414],{},[345,410,411],{},[280,412,413],{},"kind",[345,415,416,419,420,423],{},[280,417,418],{},"exec"," runs work: one or more steps, each a group of tasks. ",[280,421,422],{},"gate"," waits for a person.",[330,425,426,431],{},[345,427,428],{},[280,429,430],{},"extends",[345,432,433,434,438],{},"The ",[285,435,437],{"href":436},"#the-library-and-extends","library"," node this one builds on.",[330,440,441,445],{},[345,442,443],{},[280,444,369],{},[345,446,447,448,450],{},"This node's layer of the ",[285,449,369],{"href":157},". Safety settings only tighten. Operational values stay within the administrator's maxima.",[330,452,453,458],{},[345,454,455],{},[280,456,457],{},"skippable",[345,459,460,463,464,467,468,471,472,290],{},[280,461,462],{},"false"," refuses ",[280,465,466],{},"kraft item skip",", a chain revision's skip, and ",[280,469,470],{},"kraft item create --skip-nodes"," naming the node. Default ",[280,473,474],{},"true",[476,477,479],"h3",{"id":478},"exec-node-keys","Exec node keys",[276,481,482,483,486,487,490],{},"An exec node declares ",[280,484,485],{},"tasks"," or ",[280,488,489],{},"steps",", never both.",[324,492,493,501],{},[327,494,495],{},[330,496,497,499],{},[333,498,335],{},[333,500,338],{},[340,502,503,516,525,538,569,579,597],{},[330,504,505,509],{},[345,506,507],{},[280,508,485],{},[345,510,511,512,515],{},"Shorthand for one step named ",[280,513,514],{},"main",". Its tasks are dispatched together, and the node is measured once all have settled.",[330,517,518,522],{},[345,519,520],{},[280,521,489],{},[345,523,524],{},"Steps that run in order. A later step is not dispatched if an earlier one fails, and it sees what the earlier one left behind.",[330,526,527,532],{},[345,528,529],{},[280,530,531],{},"on_failure",[345,533,534,535,537],{},"A recovery pass: tasks or steps that run once after the node failed, before it is measured again. A task or step may carry its own ",[280,536,531],{},"; the nearest one to the failure wins.",[330,539,540,545],{},[345,541,542],{},[280,543,544],{},"fix_loop",[345,546,547,548,551,552,555,556,558,559,562,563,566,567,290],{},"Repair tasks or steps, an optional ",[280,549,550],{},"judge"," task, and an optional ",[280,553,554],{},"max_attempts",". It re-runs until the node passes, up to ",[280,557,554],{}," and the wall clock that ",[280,560,561],{},"policy.yaml"," gives the loop (",[280,564,565],{},"\u003Cnode>.fix_loop","). See ",[285,568,194],{"href":195},[330,570,571,576],{},[345,572,573],{},[280,574,575],{},"escalation",[345,577,578],{},"An agent task dispatched when the node is stuck after recovery and the fix loop, before a person is asked.",[330,580,581,586],{},[345,582,583],{},[280,584,585],{},"on_base_changed",[345,587,588,589,592,593,596],{},"What to re-run when a rebase moves the base. ",[280,590,591],{},"restart_from"," names an earlier node. ",[280,594,595],{},"on_conflict"," names the task or steps that resolve a conflicting rebase.",[330,598,599,604],{},[345,600,601],{},[280,602,603],{},"read_only",[345,605,606,608,609,611,612,290],{},[280,607,474],{}," makes Kraft verify that the node's steps leave the worktree as they found it. Refused on a node with a ",[280,610,544],{},". See ",[285,613,603],{"href":614},"#read_only",[276,616,617,618,621,622,625,626,629,630,486,633,636,637,640,641,644,645,290],{},"A recovery that concludes no repair can help reports ",[280,619,620],{},"failed"," with a\n",[280,623,624],{},"suggested_action"," (",[280,627,628],{},"skip",", ",[280,631,632],{},"retry",[280,634,635],{},"abandon",", with a reason) in its\n",[285,638,639],{"href":199},"result file",". ",[280,642,643],{},"kraft view show"," prints the one command that takes it. An infra stop\nsuggests ",[280,646,632],{},[476,648,650],{"id":649},"step-keys","Step keys",[324,652,653,661],{},[327,654,655],{},[330,656,657,659],{},[333,658,335],{},[333,660,338],{},[340,662,663,672,681,690,699,710],{},[330,664,665,669],{},[345,666,667],{},[280,668,349],{},[345,670,671],{},"The step's name, unique in the node.",[330,673,674,678],{},[345,675,676],{},[280,677,485],{},[345,679,680],{},"The step's tasks, dispatched together. At least one.",[330,682,683,687],{},[345,684,685],{},[280,686,531],{},[345,688,689],{},"A recovery pass for this step alone.",[330,691,692,696],{},[345,693,694],{},[280,695,369],{},[345,697,698],{},"This step's policy layer.",[330,700,701,705],{},[345,702,703],{},[280,704,457],{},[345,706,707,709],{},[280,708,462],{}," refuses an operator's skip.",[330,711,712,716],{},[345,713,714],{},[280,715,603],{},[345,717,718,720,721,290],{},[280,719,474],{}," verifies the step's tasks leave the worktree as they found it. See ",[285,722,603],{"href":614},[476,724,726],{"id":725},"gate-node-keys","Gate node keys",[324,728,729,737],{},[327,730,731],{},[330,732,733,735],{},[333,734,335],{},[333,736,338],{},[340,738,739,749,759,769,783,796],{},[330,740,741,746],{},[345,742,743],{},[280,744,745],{},"message",[345,747,748],{},"The text shown to the reviewer.",[330,750,751,756],{},[345,752,753],{},[280,754,755],{},"artifact",[345,757,758],{},"The document the reviewer decides on.",[330,760,761,766],{},[345,762,763],{},[280,764,765],{},"reject_to",[345,767,768],{},"The node a rejection re-enters, with the reviewer's note. It must come before the gate.",[330,770,771,776],{},[345,772,773],{},[280,774,775],{},"timeout",[345,777,778,779,782],{},"How long the gate waits for a decision. It may not exceed the ",[280,780,781],{},"total_time_cap_minutes"," around it.",[330,784,785,790],{},[345,786,787],{},[280,788,789],{},"auto_review",[345,791,792,793,290],{},"An agent task that may report a verdict first. It takes no ",[280,794,795],{},"fallback",[330,797,798,803],{},[345,799,800],{},[280,801,802],{},"chain_finalized",[345,804,805,807],{},[280,806,474],{}," marks the final review, which cannot be approved without its document.",[292,809,811],{"id":810},"task-keys","Task keys",[276,813,814],{},"Every task takes these keys, then the keys of its kind.",[324,816,817,828],{},[327,818,819],{},[330,820,821,823,826],{},[333,822,335],{},[333,824,825],{},"Type",[333,827,338],{},[340,829,830,845,867,878,897,913,925,936],{},[330,831,832,836,839],{},[345,833,834],{},[280,835,349],{},[345,837,838],{},"string",[345,840,841,842,844],{},"The task's name (",[280,843,405],{},"), unique in the step. A library entry is named by its key instead.",[330,846,847,851,853],{},[345,848,849],{},[280,850,413],{},[345,852,838],{},[345,854,855,629,858,629,861,486,864,290],{},[280,856,857],{},"agent",[280,859,860],{},"subprocess",[280,862,863],{},"builtin",[280,865,866],{},"forge",[330,868,869,873,875],{},[345,870,871],{},[280,872,430],{},[345,874,838],{},[345,876,877],{},"The library task this one builds on.",[330,879,880,885,887],{},[345,881,882],{},[280,883,884],{},"scope",[345,886,838],{},[345,888,889,892,893,896],{},[280,890,891],{},"each_repository"," runs the task once per selected repository of a workspace item. ",[280,894,895],{},"once"," (default) runs it once.",[330,898,899,904,907],{},[345,900,901],{},[280,902,903],{},"steering",[345,905,906],{},"list",[345,908,909,910,912],{},"Names from the library's ",[280,911,903],{}," section.",[330,914,915,919,922],{},[345,916,917],{},[280,918,531],{},[345,920,921],{},"mapping",[345,923,924],{},"A recovery pass for this task alone. Allowed only on a task in one of an exec node's own steps.",[330,926,927,931,933],{},[345,928,929],{},[280,930,369],{},[345,932,921],{},[345,934,935],{},"This task's own policy layer.",[330,937,938,942,945],{},[345,939,940],{},[280,941,457],{},[345,943,944],{},"boolean",[345,946,947,949,950,290],{},[280,948,462],{}," refuses an operator's skip. Default ",[280,951,474],{},[276,953,954,955,957],{},"A task takes no ",[280,956,603],{},". Set it on the step or node instead.",[476,959,961],{"id":960},"agent-task-keys","Agent task keys",[276,963,964,967],{},[280,965,966],{},"kind: agent"," runs a headless coding agent in the item's worktree.",[324,969,970,980],{},[327,971,972],{},[330,973,974,976,978],{},[333,975,335],{},[333,977,825],{},[333,979,338],{},[340,981,982,1003,1015,1050,1075,1103,1118,1136],{},[330,983,984,989,991],{},[345,985,986],{},[280,987,988],{},"harness",[345,990,838],{},[345,992,433,993,996,997,1000,1001,290],{},[285,994,995],{"href":207},"harness profile"," to run on, an ID from ",[280,998,999],{},"harnesses.yaml",". A missing or disabled profile stops the task for a human unless the task declares ",[280,1002,795],{},[330,1004,1005,1010,1012],{},[345,1006,1007],{},[280,1008,1009],{},"prompt",[345,1011,838],{},[345,1013,1014],{},"What the task is asked to do. Required. Kraft's output contract comes before the skill and steering.",[330,1016,1017,1022,1024],{},[345,1018,1019],{},[280,1020,1021],{},"skill",[345,1023,838],{},[345,1025,1026,1027,1030,1031,1034,1035,1038,1039,1042,1043,1038,1046,1049],{},"One skill to launch the agent with (",[280,1028,1029],{},"kraft:code-review",", or a plugin's ",[280,1032,1033],{},"plugin:skill","). ",[280,1036,1037],{},"spec_author"," and ",[280,1040,1041],{},"plan_author"," default to ",[280,1044,1045],{},"kraft:spec",[280,1047,1048],{},"kraft:plan",". A skill that cannot load stops the task for a human.",[330,1051,1052,1057,1059],{},[345,1053,1054],{},[280,1055,1056],{},"produces",[345,1058,838],{},[345,1060,1061,1062,629,1065,629,1068,629,1071,1074],{},"The document kind the task writes (",[280,1063,1064],{},"spec",[280,1066,1067],{},"plan",[280,1069,1070],{},"work_brief",[280,1072,1073],{},"review_brief",").",[330,1076,1077,1082,1084],{},[345,1078,1079],{},[280,1080,1081],{},"profile",[345,1083,838],{},[345,1085,1086,1087,1090,1091,625,1093,1096,1097,486,1100,290],{},"An ",[285,1088,1089],{"href":217},"agent profile"," from ",[280,1092,999],{},[280,1094,1095],{},"strong",") that sets the model tier. Not allowed with ",[280,1098,1099],{},"model",[280,1101,1102],{},"effort",[330,1104,1105,1111,1113],{},[345,1106,1107,629,1109],{},[280,1108,1099],{},[280,1110,1102],{},[345,1112,838],{},[345,1114,1115,1116,290],{},"This task's runtime options, checked against what the profile's provider accepts. Not allowed with ",[280,1117,1081],{},[330,1119,1120,1124,1126],{},[345,1121,1122],{},[280,1123,795],{},[345,1125,906],{},[345,1127,1128,1129,1132,1133,290],{},"Where the launch goes when it is rate-limited or its harness is unavailable. ",[280,1130,1131],{},"[]"," means none. See ",[285,1134,1135],{"href":225},"Fallback",[330,1137,1138,1143,1145],{},[345,1139,1140],{},[280,1141,1142],{},"inputs",[345,1144,906],{},[345,1146,1147,1148,629,1151,486,1154,290],{},"What Kraft hands the task: ",[280,1149,1150],{},"review_package",[280,1152,1153],{},"carried_findings",[280,1155,1156],{},"previous_review",[476,1158,1160],{"id":1159},"other-task-kinds","Other task kinds",[324,1162,1163,1174],{},[327,1164,1165],{},[330,1166,1167,1170,1172],{},[333,1168,1169],{},"Kind",[333,1171,335],{},[333,1173,338],{},[340,1175,1176,1203,1225,1245,1290],{},[330,1177,1178,1182,1187],{},[345,1179,1180],{},[280,1181,860],{},[345,1183,1184],{},[280,1185,1186],{},"command",[345,1188,1189,1190,1193,1194,1197,1198,611,1201,290],{},"The command to run in the worktree. It is split into arguments like a shell would, but runs with no shell, so ",[280,1191,1192],{},"&&"," and pipes need ",[280,1195,1196],{},"sh -c '...'",". Exit 0 is ",[280,1199,1200],{},"done",[285,1202,190],{"href":191},[330,1204,1205,1209,1214],{},[345,1206,1207],{},[280,1208,863],{},[345,1210,1211],{},[280,1212,1213],{},"ref",[345,1215,1216,1217,1220,1221,1224],{},"The work Kraft does itself: ",[280,1218,1219],{},"kraft.verify_changed_test_scopes"," (the repo's own test scopes) or ",[280,1222,1223],{},"kraft.mr_rebase"," (rebase the worktree onto the item's base branch).",[330,1226,1227,1231,1236],{},[345,1228,1229],{},[280,1230,863],{},[345,1232,1233],{},[280,1234,1235],{},"execution",[345,1237,1238,1241,1242,290],{},[280,1239,1240],{},"sequential"," (default) or ",[280,1243,1244],{},"parallel",[330,1246,1247,1251,1256],{},[345,1248,1249],{},[280,1250,866],{},[345,1252,1253],{},[280,1254,1255],{},"target",[345,1257,1258,1259,1261,1262,1265,1266,629,1269,629,1272,629,1275,629,1278,629,1281,629,1284,486,1287,290],{},"A merge-request action on GitHub or GitLab, resolved from the ",[280,1260,866],{}," in the repo's ",[280,1263,1264],{},"repos.yaml"," entry: ",[280,1267,1268],{},"mr.open_draft",[280,1270,1271],{},"mr.sync",[280,1273,1274],{},"mr.ci",[280,1276,1277],{},"mr.automated_review",[280,1279,1280],{},"mr.mark_ready",[280,1282,1283],{},"mr.external_approval",[280,1285,1286],{},"mr.merge",[280,1288,1289],{},"mr.post_merge_ci",[330,1291,1292,1296,1301],{},[345,1293,1294],{},[280,1295,866],{},[345,1297,1298],{},[280,1299,1300],{},"wait",[345,1302,1303,1304,1307,1308,290],{},"For a wait, ",[280,1305,1306],{},"{polling: {initial_interval: 30s, max_interval: 5m}}",". Set the timeout with the task's ",[280,1309,1310],{},"policy: {total_time_cap_minutes: 90}",[292,1312,603],{"id":603},[276,1314,1315,1317],{},[280,1316,603],{}," goes on a step or an exec node, never on a task. A task that sets it\nis refused at load.",[297,1319,1320,1337,1343,1353,1366,1372],{},[300,1321,1322,1325,1326,629,1329,1332,1333,1336],{},[1095,1323,1324],{},"What is checked."," Before a read_only step's first task launches, Kraft\nrecords each repository of the checkout (the root and every workspace member):\n",[280,1327,1328],{},"HEAD",[280,1330,1331],{},"git status --porcelain=v1 -z"," (ignored files stay out), and a hash of\n",[280,1334,1335],{},"git diff HEAD",". It reads them again after the last task exits. A read_only\nnode does the same around all of its steps.",[300,1338,1339,1342],{},[1095,1340,1341],{},"What counts as a change."," Any difference, including an untracked file or a\ncommit.",[300,1344,1345,1348,1349,1352],{},[1095,1346,1347],{},"What happens."," The item stops for a person with a ",[280,1350,1351],{},"read_only_violated","\nevent and a stop reason naming the changed files. It is not a task failure, so\nno recovery, fix loop, or attempt is spent on it.",[300,1354,1355,1358,1359,1361,1362,463,1364,290],{},[1095,1356,1357],{},"Exclusions."," Recovery and fix loops run outside the check. A recovery's\nretry of the step's tasks is checked again. A step inside an ",[280,1360,531],{}," or a\n",[280,1363,544],{},[280,1365,603],{},[300,1367,1368,1371],{},[1095,1369,1370],{},"Sandboxed items."," Kraft runs no host git in a worktree that gained a\nrepository it did not create. That repository is the reported change.",[300,1373,1374,1377],{},[1095,1375,1376],{},"Default."," Off. No shipped chain sets it. Setting it on both a node and its\nsteps is allowed and redundant.",[292,1379,1381],{"id":1380},"the-library-and-extends","The library and extends",[276,1383,1384,1387,1388,629,1390,629,1392,1394,1395,1397,1398,290],{},[280,1385,1386],{},"templates\u002Flibrary.yaml"," holds reusable ",[280,1389,485],{},[280,1391,489],{},[280,1393,359],{},", and named\n",[280,1396,903],{}," profiles. A chain component takes one with ",[280,1399,1400],{},"extends: \u003Cname>",[297,1402,1403,1406,1409,1416],{},[300,1404,1405],{},"A component extends one parent of its own kind. A node extends a node, never a\ntask.",[300,1407,1408],{},"Maps merge recursively. Lists replace.",[300,1410,1411,1412,1415],{},"A reference that resolves to nothing is an error naming the file it came from.\n",[280,1413,1414],{},"kraft admin templates lint"," reports every one.",[300,1417,1418,1421],{},[280,1419,1420],{},"kraft admin templates show ID --resolved"," prints a chain with every library\ncomponent expanded.",[1423,1424,1429],"pre",{"className":1425,"code":1426,"language":1427,"meta":1428,"style":1428},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# chains\u002Fquick-task-with-review.yaml\nid: quick-task-with-review\nnodes:\n  - id: implementation\n    kind: exec\n    tasks:\n      - { id: implement, extends: implementer }\n  - id: verification\n    extends: verification        # the library node, fix loop and all\n","yaml","",[280,1430,1431,1440,1454,1462,1476,1487,1495,1525,1537],{"__ignoreMap":1428},[1432,1433,1436],"span",{"class":1434,"line":1435},"line",1,[1432,1437,1439],{"class":1438},"sHwdD","# chains\u002Fquick-task-with-review.yaml\n",[1432,1441,1443,1446,1450],{"class":1434,"line":1442},2,[1432,1444,349],{"class":1445},"swJcz",[1432,1447,1449],{"class":1448},"sMK4o",":",[1432,1451,1453],{"class":1452},"sfazB"," quick-task-with-review\n",[1432,1455,1457,1459],{"class":1434,"line":1456},3,[1432,1458,359],{"class":1445},[1432,1460,1461],{"class":1448},":\n",[1432,1463,1465,1468,1471,1473],{"class":1434,"line":1464},4,[1432,1466,1467],{"class":1448},"  -",[1432,1469,1470],{"class":1445}," id",[1432,1472,1449],{"class":1448},[1432,1474,1475],{"class":1452}," implementation\n",[1432,1477,1479,1482,1484],{"class":1434,"line":1478},5,[1432,1480,1481],{"class":1445},"    kind",[1432,1483,1449],{"class":1448},[1432,1485,1486],{"class":1452}," exec\n",[1432,1488,1490,1493],{"class":1434,"line":1489},6,[1432,1491,1492],{"class":1445},"    tasks",[1432,1494,1461],{"class":1448},[1432,1496,1498,1501,1504,1506,1508,1511,1514,1517,1519,1522],{"class":1434,"line":1497},7,[1432,1499,1500],{"class":1448},"      -",[1432,1502,1503],{"class":1448}," {",[1432,1505,1470],{"class":1445},[1432,1507,1449],{"class":1448},[1432,1509,1510],{"class":1452}," implement",[1432,1512,1513],{"class":1448},",",[1432,1515,1516],{"class":1445}," extends",[1432,1518,1449],{"class":1448},[1432,1520,1521],{"class":1452}," implementer",[1432,1523,1524],{"class":1448}," }\n",[1432,1526,1528,1530,1532,1534],{"class":1434,"line":1527},8,[1432,1529,1467],{"class":1448},[1432,1531,1470],{"class":1445},[1432,1533,1449],{"class":1448},[1432,1535,1536],{"class":1452}," verification\n",[1432,1538,1540,1543,1545,1548],{"class":1434,"line":1539},9,[1432,1541,1542],{"class":1445},"    extends",[1432,1544,1449],{"class":1448},[1432,1546,1547],{"class":1452}," verification",[1432,1549,1550],{"class":1438},"        # the library node, fix loop and all\n",[292,1552,1554],{"id":1553},"canonical-paths","Canonical paths",[276,1556,1557,1558,629,1561,1564,1565,1568,1569,1572,1573,1576],{},"Every task, step, and node has a canonical path, for example\n",[280,1559,1560],{},"spec.main.author",[280,1562,1563],{},"verification.review.code_review",", or\n",[280,1566,1567],{},"merge_request_feedback.fix_loop.judge",". Events, sessions,\n",[280,1570,1571],{},"kraft item retry --path",", and ",[280,1574,1575],{},"kraft item skip --path"," address work by it.",[1578,1579,1580],"style",{},"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}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 .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);}",{"title":1428,"searchDepth":1442,"depth":1442,"links":1582},[1583,1584,1585,1590,1594,1595,1596],{"id":294,"depth":1442,"text":295},{"id":321,"depth":1442,"text":322},{"id":377,"depth":1442,"text":378,"children":1586},[1587,1588,1589],{"id":478,"depth":1456,"text":479},{"id":649,"depth":1456,"text":650},{"id":725,"depth":1456,"text":726},{"id":810,"depth":1442,"text":811,"children":1591},[1592,1593],{"id":960,"depth":1456,"text":961},{"id":1159,"depth":1456,"text":1160},{"id":603,"depth":1442,"text":603},{"id":1380,"depth":1442,"text":1381},{"id":1553,"depth":1442,"text":1554},"Node keys, task kinds, read_only, extends, and canonical paths in chain files.","md",null,{},{"title":10},{"title":184,"description":1597},"kzKD3GDa0SUsc6iJdLH1DjijNuEfFV3fIPpspne8wzU",[1605,1607],{"title":180,"path":181,"stem":182,"description":1606,"children":-1},"Every KRAFT_* variable Kraft reads or sets, and the other variables it reads or passes to workers.",{"title":190,"path":191,"stem":192,"description":1608,"children":-1},"What Kraft passes a subprocess task, how it runs, and how its exit code and result file become a status.",1790824509860]