[{"data":1,"prerenderedAt":2759},["ShallowReactive",2],{"navigation_docs":3,"-reference-chain-nodes":504,"-reference-chain-nodes-surround":2754},[4,28,51,187,214,469],{"title":5,"path":6,"stem":7,"children":8},"Get started","\u002Fget-started","1.get-started",[9,12,16,20,24],{"title":10,"path":6,"stem":11},"Overview","1.get-started\u002Findex",{"title":13,"path":14,"stem":15},"Why Kraft","\u002Fget-started\u002Fwhy-kraft","1.get-started\u002F0.why-kraft",{"title":17,"path":18,"stem":19},"Install","\u002Fget-started\u002Finstall","1.get-started\u002F1.install",{"title":21,"path":22,"stem":23},"Your first work item","\u002Fget-started\u002Ffirst-work-item","1.get-started\u002F2.first-work-item",{"title":25,"path":26,"stem":27},"FAQ","\u002Fget-started\u002Ffaq","1.get-started\u002F3.faq",{"title":29,"path":30,"stem":31,"children":32},"Concepts","\u002Fconcepts","2.concepts",[33,35,39,43,47],{"title":10,"path":30,"stem":34},"2.concepts\u002Findex",{"title":36,"path":37,"stem":38},"How a work item runs","\u002Fconcepts\u002Fhow-a-work-item-runs","2.concepts\u002F1.how-a-work-item-runs",{"title":40,"path":41,"stem":42},"Caps and budgets","\u002Fconcepts\u002Fcaps-and-budgets","2.concepts\u002F2.caps-and-budgets",{"title":44,"path":45,"stem":46},"Why a permission gate","\u002Fconcepts\u002Fpermission-gate","2.concepts\u002F3.permission-gate",{"title":48,"path":49,"stem":50},"Vocabulary","\u002Fconcepts\u002Fvocabulary","2.concepts\u002F4.vocabulary",{"title":52,"path":53,"stem":54,"children":55},"Guides","\u002Fguides","3.guides",[56,58,96,113,134,183],{"title":10,"path":53,"stem":57},"3.guides\u002Findex",{"title":59,"path":60,"stem":61,"children":62,"page":95},"Day to day","\u002Fguides\u002Fday-to-day","3.guides\u002F1.day-to-day",[63,67,71,75,79,83,87,91],{"title":64,"path":65,"stem":66},"The setup wizard on first start","\u002Fguides\u002Fday-to-day\u002Ffirst-run","3.guides\u002F1.day-to-day\u002F2.first-run",{"title":68,"path":69,"stem":70},"File a work item","\u002Fguides\u002Fday-to-day\u002Ffile-a-work-item","3.guides\u002F1.day-to-day\u002F3.file-a-work-item",{"title":72,"path":73,"stem":74},"Use Kraft from your agent","\u002Fguides\u002Fday-to-day\u002Fagent-integration","3.guides\u002F1.day-to-day\u002F4.agent-integration",{"title":76,"path":77,"stem":78},"Reviewing a change","\u002Fguides\u002Fday-to-day\u002Freview-a-change","3.guides\u002F1.day-to-day\u002F5.review-a-change",{"title":80,"path":81,"stem":82},"Raise a cap on a stopped item","\u002Fguides\u002Fday-to-day\u002Fraise-a-cap","3.guides\u002F1.day-to-day\u002F6.raise-a-cap",{"title":84,"path":85,"stem":86},"Kraft for VS Code","\u002Fguides\u002Fday-to-day\u002Fvscode","3.guides\u002F1.day-to-day\u002F7.vscode",{"title":88,"path":89,"stem":90},"Kraft on a phone","\u002Fguides\u002Fday-to-day\u002Fkraft-on-a-phone","3.guides\u002F1.day-to-day\u002F8.kraft-on-a-phone",{"title":92,"path":93,"stem":94},"Get notified when an item needs you","\u002Fguides\u002Fday-to-day\u002Fnotifications","3.guides\u002F1.day-to-day\u002F9.notifications",false,{"title":97,"path":98,"stem":99,"children":100,"page":95},"Customize and automate","\u002Fguides\u002Fcustomize","3.guides\u002F2.customize",[101,105,109],{"title":102,"path":103,"stem":104},"Write your own chain","\u002Fguides\u002Fcustomize\u002Fwrite-your-own-chain","3.guides\u002F2.customize\u002F1.write-your-own-chain",{"title":106,"path":107,"stem":108},"Add a security review or a gate reviewer","\u002Fguides\u002Fcustomize\u002Fadd-review-agents","3.guides\u002F2.customize\u002F2.add-review-agents",{"title":110,"path":111,"stem":112},"Schedule or webhook work","\u002Fguides\u002Fcustomize\u002Fschedule-and-webhook-work","3.guides\u002F2.customize\u002F3.schedule-and-webhook-work",{"title":114,"path":115,"stem":116,"children":117,"page":95},"Agents and harnesses","\u002Fguides\u002Fharnesses","3.guides\u002F3.harnesses",[118,122,126,130],{"title":119,"path":120,"stem":121},"Switch a task to another harness","\u002Fguides\u002Fharnesses\u002Fswitch-harness","3.guides\u002F3.harnesses\u002F1.switch-harness",{"title":123,"path":124,"stem":125},"Add or override a harness","\u002Fguides\u002Fharnesses\u002Fadding-a-harness","3.guides\u002F3.harnesses\u002F2.adding-a-harness",{"title":127,"path":128,"stem":129},"Build a worker Kit","\u002Fguides\u002Fharnesses\u002Fworker-kit","3.guides\u002F3.harnesses\u002F3.worker-kit",{"title":131,"path":132,"stem":133},"Give a worker its login","\u002Fguides\u002Fharnesses\u002Fgive-a-worker-its-login","3.guides\u002F3.harnesses\u002F4.give-a-worker-its-login",{"title":135,"path":136,"stem":137,"children":138,"page":95},"Run the server","\u002Fguides\u002Frun","3.guides\u002F4.run",[139,143,147,151,155,159,163,167,171,175,179],{"title":140,"path":141,"stem":142},"Remote access","\u002Fguides\u002Frun\u002Fremote-access","3.guides\u002F4.run\u002F01.remote-access",{"title":144,"path":145,"stem":146},"Put a proxy in front of Kraft","\u002Fguides\u002Frun\u002Fput-a-proxy-in-front-of-kraft","3.guides\u002F4.run\u002F02.put-a-proxy-in-front-of-kraft",{"title":148,"path":149,"stem":150},"Restart Kraft without ending running agents","\u002Fguides\u002Frun\u002Frestart-kraft","3.guides\u002F4.run\u002F03.restart-kraft",{"title":152,"path":153,"stem":154},"Back up and restore the database","\u002Fguides\u002Frun\u002Fback-up-and-restore","3.guides\u002F4.run\u002F04.back-up-and-restore",{"title":156,"path":157,"stem":158},"Logs and disk space","\u002Fguides\u002Frun\u002Flogs-and-disk-space","3.guides\u002F4.run\u002F05.logs-and-disk-space",{"title":160,"path":161,"stem":162},"Run Kraft as a service","\u002Fguides\u002Frun\u002Frun-as-a-service","3.guides\u002F4.run\u002F06.run-as-a-service",{"title":164,"path":165,"stem":166},"Upgrade Kraft","\u002Fguides\u002Frun\u002Fupgrade-kraft","3.guides\u002F4.run\u002F07.upgrade-kraft",{"title":168,"path":169,"stem":170},"Upgrade your configuration","\u002Fguides\u002Frun\u002Fupgrade-your-configuration","3.guides\u002F4.run\u002F08.upgrade-your-configuration",{"title":172,"path":173,"stem":174},"Upgrade from 1.4","\u002Fguides\u002Frun\u002Fupgrade-from-1-4","3.guides\u002F4.run\u002F09.upgrade-from-1-4",{"title":176,"path":177,"stem":178},"Upgrade from 0.x or a release candidate","\u002Fguides\u002Frun\u002Fupgrade-from-0-x-or-a-release-candidate","3.guides\u002F4.run\u002F10.upgrade-from-0-x-or-a-release-candidate",{"title":180,"path":181,"stem":182},"Roll back to 1.4","\u002Fguides\u002Frun\u002Froll-back","3.guides\u002F4.run\u002F11.roll-back",{"title":184,"path":185,"stem":186},"Kraft Lite","\u002Fguides\u002Fkraft-lite","3.guides\u002F5.kraft-lite",{"title":188,"path":189,"stem":190,"children":191},"Troubleshooting","\u002Ftroubleshooting","4.troubleshooting",[192,194,198,202,206,210],{"title":10,"path":189,"stem":193},"4.troubleshooting\u002Findex",{"title":195,"path":196,"stem":197},"Why did my item stop?","\u002Ftroubleshooting\u002Fwhy-did-my-item-stop","4.troubleshooting\u002F1.why-did-my-item-stop",{"title":199,"path":200,"stem":201},"Stop reasons in detail","\u002Ftroubleshooting\u002Fstop-reasons-in-detail","4.troubleshooting\u002F2.stop-reasons-in-detail",{"title":203,"path":204,"stem":205},"Starting and reaching Kraft","\u002Ftroubleshooting\u002Fstarting-and-reaching-kraft","4.troubleshooting\u002F3.starting-and-reaching-kraft",{"title":207,"path":208,"stem":209},"Doctor failures","\u002Ftroubleshooting\u002Fdoctor-failures","4.troubleshooting\u002F4.doctor-failures",{"title":211,"path":212,"stem":213},"Sandbox and Kit stops","\u002Ftroubleshooting\u002Fsandbox-and-kit-stops","4.troubleshooting\u002F5.sandbox-and-kit-stops",{"title":215,"path":216,"stem":217,"children":218},"Reference","\u002Freference","5.reference",[219,221,259,281,285,375,393,419,423,427,461,465],{"title":10,"path":216,"stem":220},"5.reference\u002Findex",{"title":222,"path":223,"stem":224,"children":225},"Web UI","\u002Freference\u002Fweb-ui","5.reference\u002F00.web-ui\u002Findex",[226,227,231,235,239,243,247,251,255],{"title":10,"path":223,"stem":224},{"title":228,"path":229,"stem":230},"Sidebar, search, and keyboard","\u002Freference\u002Fweb-ui\u002Fsidebar-search-and-keyboard","5.reference\u002F00.web-ui\u002F0.sidebar-search-and-keyboard",{"title":232,"path":233,"stem":234},"The board","\u002Freference\u002Fweb-ui\u002Fboard","5.reference\u002F00.web-ui\u002F1.board",{"title":236,"path":237,"stem":238},"An item's page","\u002Freference\u002Fweb-ui\u002Fitem-page","5.reference\u002F00.web-ui\u002F2.item-page",{"title":240,"path":241,"stem":242},"Fix loops and test scopes","\u002Freference\u002Fweb-ui\u002Ffix-loops-and-test-scopes","5.reference\u002F00.web-ui\u002F3.fix-loops-and-test-scopes",{"title":244,"path":245,"stem":246},"Config before an item starts","\u002Freference\u002Fweb-ui\u002Fconfig-before-start","5.reference\u002F00.web-ui\u002F4.config-before-start",{"title":248,"path":249,"stem":250},"The review page","\u002Freference\u002Fweb-ui\u002Freview-page","5.reference\u002F00.web-ui\u002F5.review-page",{"title":252,"path":253,"stem":254},"Templates and Settings","\u002Freference\u002Fweb-ui\u002Ftemplates-and-settings","5.reference\u002F00.web-ui\u002F6.templates-and-settings",{"title":256,"path":257,"stem":258},"Analytics","\u002Freference\u002Fweb-ui\u002Fanalytics","5.reference\u002F00.web-ui\u002F7.analytics",{"title":260,"path":261,"stem":262,"children":263},"CLI","\u002Freference\u002Fcli","5.reference\u002F01.cli\u002Findex",[264,265,269,273,277],{"title":10,"path":261,"stem":262},{"title":266,"path":267,"stem":268},"Item verbs","\u002Freference\u002Fcli\u002Fitem","5.reference\u002F01.cli\u002F2.item",{"title":270,"path":271,"stem":272},"View verbs","\u002Freference\u002Fcli\u002Fview","5.reference\u002F01.cli\u002F3.view",{"title":274,"path":275,"stem":276},"Repo verbs","\u002Freference\u002Fcli\u002Frepo","5.reference\u002F01.cli\u002F4.repo",{"title":278,"path":279,"stem":280},"Admin verbs","\u002Freference\u002Fcli\u002Fadmin","5.reference\u002F01.cli\u002F5.admin",{"title":282,"path":283,"stem":284},"Work item statuses","\u002Freference\u002Fstatuses","5.reference\u002F02.statuses",{"title":286,"path":287,"stem":288,"children":289},"Configuration","\u002Freference\u002Fconfiguration","5.reference\u002F03.configuration\u002Findex",[290,291,309,313,317,321,325,329,333,337,371],{"title":10,"path":287,"stem":288},{"title":292,"path":293,"stem":294,"children":295},"repos.yaml","\u002Freference\u002Fconfiguration\u002Frepos","5.reference\u002F03.configuration\u002F02.repos\u002Findex",[296,297,301,305],{"title":10,"path":293,"stem":294},{"title":298,"path":299,"stem":300},"How connect proposes commands","\u002Freference\u002Fconfiguration\u002Frepos\u002Fconnect-proposals","5.reference\u002F03.configuration\u002F02.repos\u002F1.connect-proposals",{"title":302,"path":303,"stem":304},"detectors.yaml","\u002Freference\u002Fconfiguration\u002Frepos\u002Fdetectors","5.reference\u002F03.configuration\u002F02.repos\u002F2.detectors",{"title":306,"path":307,"stem":308},"Workspaces","\u002Freference\u002Fconfiguration\u002Frepos\u002Fworkspaces","5.reference\u002F03.configuration\u002F02.repos\u002F3.workspaces",{"title":310,"path":311,"stem":312},"policy.yaml","\u002Freference\u002Fconfiguration\u002Fpolicy","5.reference\u002F03.configuration\u002F03.policy",{"title":314,"path":315,"stem":316},"Library and chains","\u002Freference\u002Fconfiguration\u002Flibrary-and-chains","5.reference\u002F03.configuration\u002F04.library-and-chains",{"title":318,"path":319,"stem":320},"harnesses.yaml","\u002Freference\u002Fconfiguration\u002Fharnesses-file","5.reference\u002F03.configuration\u002F05.harnesses-file",{"title":322,"path":323,"stem":324},"access.yaml","\u002Freference\u002Fconfiguration\u002Faccess","5.reference\u002F03.configuration\u002F06.access",{"title":326,"path":327,"stem":328},"intake.yaml","\u002Freference\u002Fconfiguration\u002Fintake","5.reference\u002F03.configuration\u002F07.intake",{"title":330,"path":331,"stem":332},"notify.yaml","\u002Freference\u002Fconfiguration\u002Fnotify","5.reference\u002F03.configuration\u002F08.notify",{"title":334,"path":335,"stem":336},"theme.yaml","\u002Freference\u002Fconfiguration\u002Ftheme","5.reference\u002F03.configuration\u002F09.theme",{"title":338,"path":339,"stem":340,"children":341},"Sandboxed workers","\u002Freference\u002Fconfiguration\u002Fsandbox","5.reference\u002F03.configuration\u002F10.sandbox\u002Findex",[342,343,347,351,355,359,363,367],{"title":10,"path":339,"stem":340},{"title":344,"path":345,"stem":346},"Resource limits","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fresource-limits","5.reference\u002F03.configuration\u002F10.sandbox\u002F1.resource-limits",{"title":348,"path":349,"stem":350},"Callbacks from a sandbox","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fcallbacks","5.reference\u002F03.configuration\u002F10.sandbox\u002F2.callbacks",{"title":352,"path":353,"stem":354},"Network policy","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fnetwork-policy","5.reference\u002F03.configuration\u002F10.sandbox\u002F3.network-policy",{"title":356,"path":357,"stem":358},"Credentials","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fcredentials","5.reference\u002F03.configuration\u002F10.sandbox\u002F4.credentials",{"title":360,"path":361,"stem":362},"Kits","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fkits","5.reference\u002F03.configuration\u002F10.sandbox\u002F5.kits",{"title":364,"path":365,"stem":366},"sandbox.yaml","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fsandbox-yaml","5.reference\u002F03.configuration\u002F10.sandbox\u002F6.sandbox-yaml",{"title":368,"path":369,"stem":370},"Git in a sandbox","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fgit-in-a-sandbox","5.reference\u002F03.configuration\u002F10.sandbox\u002F7.git-in-a-sandbox",{"title":372,"path":373,"stem":374},"Environment variables","\u002Freference\u002Fconfiguration\u002Fenvironment-variables","5.reference\u002F03.configuration\u002F11.environment-variables",{"title":376,"path":377,"stem":378,"children":379},"Chain file keys","\u002Freference\u002Fchain-nodes","5.reference\u002F04.chain-nodes\u002Findex",[380,381,385,389],{"title":10,"path":377,"stem":378},{"title":382,"path":383,"stem":384},"Subprocess tasks","\u002Freference\u002Fchain-nodes\u002Fsubprocess-tasks","5.reference\u002F04.chain-nodes\u002F2.subprocess-tasks",{"title":386,"path":387,"stem":388},"Fix loop and judge","\u002Freference\u002Fchain-nodes\u002Ffix-loop","5.reference\u002F04.chain-nodes\u002F3.fix-loop",{"title":390,"path":391,"stem":392},"Result file","\u002Freference\u002Fchain-nodes\u002Fresult-file","5.reference\u002F04.chain-nodes\u002F4.result-file",{"title":394,"path":395,"stem":396,"children":397},"Agent harnesses","\u002Freference\u002Fharnesses","5.reference\u002F05.harnesses\u002Findex",[398,399,403,407,411,415],{"title":10,"path":395,"stem":396},{"title":400,"path":401,"stem":402},"Unattended runs","\u002Freference\u002Fharnesses\u002Funattended-runs","5.reference\u002F05.harnesses\u002F2.unattended-runs",{"title":404,"path":405,"stem":406},"Agent profiles","\u002Freference\u002Fharnesses\u002Fagent-profiles","5.reference\u002F05.harnesses\u002F3.agent-profiles",{"title":408,"path":409,"stem":410},"Harness definition files","\u002Freference\u002Fharnesses\u002Fharness-files","5.reference\u002F05.harnesses\u002F4.harness-files",{"title":412,"path":413,"stem":414},"Fallback and escalation","\u002Freference\u002Fharnesses\u002Ffallback-and-escalation","5.reference\u002F05.harnesses\u002F5.fallback-and-escalation",{"title":416,"path":417,"stem":418},"Cost reporting","\u002Freference\u002Fharnesses\u002Fcost-reporting","5.reference\u002F05.harnesses\u002F6.cost-reporting",{"title":420,"path":421,"stem":422},"Permission gate","\u002Freference\u002Fpermissions","5.reference\u002F06.permissions",{"title":424,"path":425,"stem":426},"Inbound triggers","\u002Freference\u002Ftriggers","5.reference\u002F07.triggers",{"title":428,"path":429,"stem":430,"children":431},"HTTP API","\u002Freference\u002Fhttp-api","5.reference\u002F08.http-api\u002Findex",[432,433,437,441,445,449,453,457],{"title":10,"path":429,"stem":430},{"title":434,"path":435,"stem":436},"Filing, reading and changing work items","\u002Freference\u002Fhttp-api\u002Fwork-items","5.reference\u002F08.http-api\u002F2.work-items",{"title":438,"path":439,"stem":440},"Gates, run control, ending and retry","\u002Freference\u002Fhttp-api\u002Fgates-run-control-and-ending","5.reference\u002F08.http-api\u002F3.gates-run-control-and-ending",{"title":442,"path":443,"stem":444},"The work item object","\u002Freference\u002Fhttp-api\u002Fwork-item-object","5.reference\u002F08.http-api\u002F4.work-item-object",{"title":446,"path":447,"stem":448},"Budget, events, diff and documents","\u002Freference\u002Fhttp-api\u002Fbudget-and-events","5.reference\u002F08.http-api\u002F5.budget-and-events",{"title":450,"path":451,"stem":452},"Repos, chains, harnesses and the server","\u002Freference\u002Fhttp-api\u002Frepos-chains-harnesses-and-server","5.reference\u002F08.http-api\u002F6.repos-chains-harnesses-and-server",{"title":454,"path":455,"stem":456},"Drafts","\u002Freference\u002Fhttp-api\u002Fdrafts","5.reference\u002F08.http-api\u002F7.drafts",{"title":458,"path":459,"stem":460},"Ops for each draft area","\u002Freference\u002Fhttp-api\u002Fdraft-ops","5.reference\u002F08.http-api\u002F8.draft-ops",{"title":462,"path":463,"stem":464},"MCP tools","\u002Freference\u002Fmcp-tools","5.reference\u002F09.mcp-tools",{"title":466,"path":467,"stem":468},"Events","\u002Freference\u002Fevents","5.reference\u002F10.events",{"title":470,"path":471,"stem":472,"children":473},"Security and project","\u002Fproject","6.project",[474,476,480,484,488,492,496,500],{"title":10,"path":471,"stem":475},"6.project\u002Findex",{"title":477,"path":478,"stem":479},"Security","\u002Fproject\u002Fsecurity","6.project\u002F1.security",{"title":481,"path":482,"stem":483},"Data and privacy","\u002Fproject\u002Fdata-and-privacy","6.project\u002F2.data-and-privacy",{"title":485,"path":486,"stem":487},"What's new in 2.0","\u002Fproject\u002Fwhats-new","6.project\u002F3.whats-new",{"title":489,"path":490,"stem":491},"Status and support","\u002Fproject\u002Fstatus-and-support","6.project\u002F4.status-and-support",{"title":493,"path":494,"stem":495},"Architecture","\u002Fproject\u002Farchitecture","6.project\u002F5.architecture",{"title":497,"path":498,"stem":499},"Source map","\u002Fproject\u002Fsource-map","6.project\u002F6.source-map",{"title":501,"path":502,"stem":503},"Contributing","\u002Fproject\u002Fcontributing","6.project\u002F7.contributing",{"id":505,"title":376,"body":506,"description":2747,"extension":2748,"links":2749,"meta":2750,"navigation":2751,"path":377,"seo":2752,"stem":378,"__hash__":2753},"docs\u002F5.reference\u002F04.chain-nodes\u002Findex.md",{"type":507,"value":508,"toc":2723},"minimark",[509,525,530,555,915,928,932,1018,1022,1025,1152,1157,1168,1347,1360,1364,1522,1527,1529,1542,1587,1598,1641,1651,1655,1792,1796,1802,1987,1990,2020,2024,2030,2242,2246,2252,2295,2299,2305,2367,2371,2383,2464,2515,2517,2522,2587,2591,2610,2620,2624,2643,2663,2668,2672,2694,2698,2719],[510,511,512,513,517,518,521,522,524],"p",{},"The keys a chain file under ",[514,515,516],"code",{},"config\u002Fchains\u002F"," accepts: the chain's own, then each\nkind of node, step and task. For what a chain, node, task and gate are, see\n",[519,520,48],"a",{"href":49},". For the reusable components a chain extends,\nsee ",[519,523,314],{"href":315},".",[526,527,529],"h2",{"id":528},"example","Example",[510,531,532,533,537,538,542,543,546,547,550,551,554],{},"A chain of three nodes: an agent implements, a command runs under a ",[519,534,536],{"href":535},"\u002Fconcepts\u002Fvocabulary#fix-loop","fix loop","\nwith a ",[519,539,541],{"href":540},"\u002Fconcepts\u002Fvocabulary#judge","judge",", and a gate waits for approval. ",[514,544,545],{},"implementation"," and ",[514,548,549],{},"strict_judge","\nare components of the shipped library, which ",[514,552,553],{},"extends"," pulls in.",[556,557,563],"pre",{"className":558,"code":559,"filename":560,"language":561,"meta":562,"style":562},"language-yaml shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","id: example\ndescription: Implement, check with a fix loop, then ask for approval.\nnodes:\n  - id: implementation\n    extends: implementation          # a library node, tasks and all\n\n  - id: checks\n    kind: exec\n    skippable: false\n    policy:\n      time_cap_minutes: 30\n    steps:\n      - id: lint\n        tasks:\n          - id: lint\n            kind: subprocess\n            command: sh -c 'npm run lint && npx tsc --noEmit'\n    fix_loop:\n      tasks:\n        - id: repair\n          kind: agent\n          harness: claude\n          profile: strong\n          prompt: Fix what the checks reported.\n      judge:\n        id: judge\n        extends: strict_judge\n      max_attempts: 3\n\n  - id: review\n    kind: gate\n    message: Review the change.\n    reject_to: implementation\n","config\u002Fchains\u002Fexample.yaml","yaml","",[514,564,565,582,593,602,615,629,636,648,659,671,679,690,698,711,719,731,742,753,761,769,782,793,804,815,826,834,845,856,867,872,884,894,905],{"__ignoreMap":562},[566,567,570,574,578],"span",{"class":568,"line":569},"line",1,[566,571,573],{"class":572},"sb7M8","id",[566,575,577],{"class":576},"s7iLA",": ",[566,579,581],{"class":580},"semJd","example\n",[566,583,585,588,590],{"class":568,"line":584},2,[566,586,587],{"class":572},"description",[566,589,577],{"class":576},[566,591,592],{"class":580},"Implement, check with a fix loop, then ask for approval.\n",[566,594,596,599],{"class":568,"line":595},3,[566,597,598],{"class":572},"nodes",[566,600,601],{"class":576},":\n",[566,603,605,608,610,612],{"class":568,"line":604},4,[566,606,607],{"class":576},"  - ",[566,609,573],{"class":572},[566,611,577],{"class":576},[566,613,614],{"class":580},"implementation\n",[566,616,618,621,623,625],{"class":568,"line":617},5,[566,619,620],{"class":572},"    extends",[566,622,577],{"class":576},[566,624,545],{"class":580},[566,626,628],{"class":627},"sq92B","          # a library node, tasks and all\n",[566,630,632],{"class":568,"line":631},6,[566,633,635],{"emptyLinePlaceholder":634},true,"\n",[566,637,639,641,643,645],{"class":568,"line":638},7,[566,640,607],{"class":576},[566,642,573],{"class":572},[566,644,577],{"class":576},[566,646,647],{"class":580},"checks\n",[566,649,651,654,656],{"class":568,"line":650},8,[566,652,653],{"class":572},"    kind",[566,655,577],{"class":576},[566,657,658],{"class":580},"exec\n",[566,660,662,665,667],{"class":568,"line":661},9,[566,663,664],{"class":572},"    skippable",[566,666,577],{"class":576},[566,668,670],{"class":669},"ssYy9","false\n",[566,672,674,677],{"class":568,"line":673},10,[566,675,676],{"class":572},"    policy",[566,678,601],{"class":576},[566,680,682,685,687],{"class":568,"line":681},11,[566,683,684],{"class":572},"      time_cap_minutes",[566,686,577],{"class":576},[566,688,689],{"class":669},"30\n",[566,691,693,696],{"class":568,"line":692},12,[566,694,695],{"class":572},"    steps",[566,697,601],{"class":576},[566,699,701,704,706,708],{"class":568,"line":700},13,[566,702,703],{"class":576},"      - ",[566,705,573],{"class":572},[566,707,577],{"class":576},[566,709,710],{"class":580},"lint\n",[566,712,714,717],{"class":568,"line":713},14,[566,715,716],{"class":572},"        tasks",[566,718,601],{"class":576},[566,720,722,725,727,729],{"class":568,"line":721},15,[566,723,724],{"class":576},"          - ",[566,726,573],{"class":572},[566,728,577],{"class":576},[566,730,710],{"class":580},[566,732,734,737,739],{"class":568,"line":733},16,[566,735,736],{"class":572},"            kind",[566,738,577],{"class":576},[566,740,741],{"class":580},"subprocess\n",[566,743,745,748,750],{"class":568,"line":744},17,[566,746,747],{"class":572},"            command",[566,749,577],{"class":576},[566,751,752],{"class":580},"sh -c 'npm run lint && npx tsc --noEmit'\n",[566,754,756,759],{"class":568,"line":755},18,[566,757,758],{"class":572},"    fix_loop",[566,760,601],{"class":576},[566,762,764,767],{"class":568,"line":763},19,[566,765,766],{"class":572},"      tasks",[566,768,601],{"class":576},[566,770,772,775,777,779],{"class":568,"line":771},20,[566,773,774],{"class":576},"        - ",[566,776,573],{"class":572},[566,778,577],{"class":576},[566,780,781],{"class":580},"repair\n",[566,783,785,788,790],{"class":568,"line":784},21,[566,786,787],{"class":572},"          kind",[566,789,577],{"class":576},[566,791,792],{"class":580},"agent\n",[566,794,796,799,801],{"class":568,"line":795},22,[566,797,798],{"class":572},"          harness",[566,800,577],{"class":576},[566,802,803],{"class":580},"claude\n",[566,805,807,810,812],{"class":568,"line":806},23,[566,808,809],{"class":572},"          profile",[566,811,577],{"class":576},[566,813,814],{"class":580},"strong\n",[566,816,818,821,823],{"class":568,"line":817},24,[566,819,820],{"class":572},"          prompt",[566,822,577],{"class":576},[566,824,825],{"class":580},"Fix what the checks reported.\n",[566,827,829,832],{"class":568,"line":828},25,[566,830,831],{"class":572},"      judge",[566,833,601],{"class":576},[566,835,837,840,842],{"class":568,"line":836},26,[566,838,839],{"class":572},"        id",[566,841,577],{"class":576},[566,843,844],{"class":580},"judge\n",[566,846,848,851,853],{"class":568,"line":847},27,[566,849,850],{"class":572},"        extends",[566,852,577],{"class":576},[566,854,855],{"class":580},"strict_judge\n",[566,857,859,862,864],{"class":568,"line":858},28,[566,860,861],{"class":572},"      max_attempts",[566,863,577],{"class":576},[566,865,866],{"class":669},"3\n",[566,868,870],{"class":568,"line":869},29,[566,871,635],{"emptyLinePlaceholder":634},[566,873,875,877,879,881],{"class":568,"line":874},30,[566,876,607],{"class":576},[566,878,573],{"class":572},[566,880,577],{"class":576},[566,882,883],{"class":580},"review\n",[566,885,887,889,891],{"class":568,"line":886},31,[566,888,653],{"class":572},[566,890,577],{"class":576},[566,892,893],{"class":580},"gate\n",[566,895,897,900,902],{"class":568,"line":896},32,[566,898,899],{"class":572},"    message",[566,901,577],{"class":576},[566,903,904],{"class":580},"Review the change.\n",[566,906,908,911,913],{"class":568,"line":907},33,[566,909,910],{"class":572},"    reject_to",[566,912,577],{"class":576},[566,914,614],{"class":580},[510,916,917,918,921,922,925,926,524],{},"Kraft refuses a key that these tables do not list when it loads the chain, and\n",[514,919,920],{},"kraft admin templates lint"," reports it. A default of ",[514,923,924],{},"required"," means the key\nhas no default: the chain must set it, itself or through ",[514,927,553],{},[526,929,931],{"id":930},"chain-keys","Chain keys",[933,934,935,954],"table",{},[936,937,938],"thead",{},[939,940,941,945,948,951],"tr",{},[942,943,944],"th",{},"Key",[942,946,947],{},"Type",[942,949,950],{},"Default",[942,952,953],{},"Meaning",[955,956,957,973,987,1001],"tbody",{},[939,958,959,964,967,970],{},[960,961,962],"td",{},[514,963,573],{},[960,965,966],{},"string",[960,968,969],{},"The file name",[960,971,972],{},"The chain's name.",[939,974,975,979,981,984],{},[960,976,977],{},[514,978,587],{},[960,980,966],{},[960,982,983],{},"none",[960,985,986],{},"One line saying what the chain is for, shown in the chain list. Listed even for a chain that does not resolve.",[939,988,989,993,996,998],{},[960,990,991],{},[514,992,598],{},[960,994,995],{},"list",[960,997,924],{},[960,999,1000],{},"The ordered list of nodes. At least one.",[939,1002,1003,1008,1011,1013],{},[960,1004,1005],{},[514,1006,1007],{},"policy",[960,1009,1010],{},"mapping",[960,1012,983],{},[960,1014,1015,1016,524],{},"The chain's layer of the ",[519,1017,1007],{"href":311},[526,1019,1021],{"id":1020},"node-keys","Node keys",[510,1023,1024],{},"Every node takes these keys, then the keys of its kind.",[933,1026,1027,1039],{},[936,1028,1029],{},[939,1030,1031,1033,1035,1037],{},[942,1032,944],{},[942,1034,947],{},[942,1036,950],{},[942,1038,953],{},[955,1040,1041,1058,1083,1101,1123],{},[939,1042,1043,1047,1049,1051],{},[960,1044,1045],{},[514,1046,573],{},[960,1048,966],{},[960,1050,924],{},[960,1052,1053,1054,1057],{},"The node's name (",[514,1055,1056],{},"[a-z][a-z0-9_-]*","), unique in the chain.",[939,1059,1060,1065,1067,1073],{},[960,1061,1062],{},[514,1063,1064],{},"kind",[960,1066,966],{},[960,1068,1069,1070,1072],{},"required, unless ",[514,1071,553],{}," supplies it",[960,1074,1075,1078,1079,1082],{},[514,1076,1077],{},"exec"," runs work: one or more steps, each a group of tasks. ",[514,1080,1081],{},"gate"," waits for you.",[939,1084,1085,1089,1091,1093],{},[960,1086,1087],{},[514,1088,553],{},[960,1090,966],{},[960,1092,983],{},[960,1094,1095,1096,1100],{},"The ",[519,1097,1099],{"href":1098},"#the-library-and-extends","library"," node this one builds on.",[939,1102,1103,1107,1109,1111],{},[960,1104,1105],{},[514,1106,1007],{},[960,1108,1010],{},[960,1110,983],{},[960,1112,1113,1114,1116,1117,1120,1121,524],{},"This node's layer of the ",[519,1115,1007],{"href":311},". Safety settings only tighten. Operational values stay within the ",[514,1118,1119],{},"maxima"," in ",[514,1122,310],{},[939,1124,1125,1130,1133,1138],{},[960,1126,1127],{},[514,1128,1129],{},"skippable",[960,1131,1132],{},"boolean",[960,1134,1135],{},[514,1136,1137],{},"true",[960,1139,1140,1143,1144,1147,1148,1151],{},[514,1141,1142],{},"false"," refuses ",[514,1145,1146],{},"kraft item skip",", a chain revision's skip, and ",[514,1149,1150],{},"kraft item create --skip-nodes"," naming the node.",[1153,1154,1156],"h3",{"id":1155},"exec-node-keys","Exec node keys",[510,1158,1159,1160,1163,1164,1167],{},"An exec node declares ",[514,1161,1162],{},"tasks"," or ",[514,1165,1166],{},"steps",", never both.",[933,1169,1170,1182],{},[936,1171,1172],{},[939,1173,1174,1176,1178,1180],{},[942,1175,944],{},[942,1177,947],{},[942,1179,950],{},[942,1181,953],{},[955,1183,1184,1209,1225,1242,1265,1284,1301,1330],{},[939,1185,1186,1190,1192,1202],{},[960,1187,1188],{},[514,1189,1162],{},[960,1191,995],{},[960,1193,1194,1195,546,1197,1199,1200,1072],{},"one of ",[514,1196,1162],{},[514,1198,1166],{}," is required, unless ",[514,1201,553],{},[960,1203,1204,1205,1208],{},"Shorthand for one step named ",[514,1206,1207],{},"main",". Its tasks are dispatched together, and the node is measured once all have settled.",[939,1210,1211,1215,1217,1222],{},[960,1212,1213],{},[514,1214,1166],{},[960,1216,995],{},[960,1218,1219,1220],{},"see ",[514,1221,1162],{},[960,1223,1224],{},"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.",[939,1226,1227,1232,1234,1236],{},[960,1228,1229],{},[514,1230,1231],{},"on_failure",[960,1233,1010],{},[960,1235,983],{},[960,1237,1238,1239,1241],{},"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 ",[514,1240,1231],{},"; the nearest one to the failure wins.",[939,1243,1244,1249,1251,1253],{},[960,1245,1246],{},[514,1247,1248],{},"fix_loop",[960,1250,1010],{},[960,1252,983],{},[960,1254,1255,1256,1258,1259,1262,1263,524],{},"Repair tasks or steps, an optional ",[514,1257,541],{}," task, and an optional ",[514,1260,1261],{},"max_attempts",". It re-runs until the node passes. See ",[519,1264,386],{"href":387},[939,1266,1267,1272,1274,1276],{},[960,1268,1269],{},[514,1270,1271],{},"escalation",[960,1273,1010],{},[960,1275,983],{},[960,1277,1278,1279,1283],{},"An agent task dispatched when the node is ",[519,1280,1282],{"href":1281},"\u002Fconcepts\u002Fvocabulary#stuck","stuck"," after recovery and the fix loop, before you are asked.",[939,1285,1286,1291,1293,1295],{},[960,1287,1288],{},[514,1289,1290],{},"on_base_changed",[960,1292,1010],{},[960,1294,983],{},[960,1296,1297,1298,524],{},"What to re-run when a rebase moves the base. See ",[519,1299,1290],{"href":1300},"#on_base_changed",[939,1302,1303,1308,1310,1314],{},[960,1304,1305],{},[514,1306,1307],{},"read_only",[960,1309,1132],{},[960,1311,1312],{},[514,1313,1142],{},[960,1315,1316,1318,1319,1323,1324,1326,1327,524],{},[514,1317,1137],{}," makes Kraft verify that the node's steps leave the ",[519,1320,1322],{"href":1321},"\u002Fconcepts\u002Fvocabulary#worktree","worktree"," as they found it. Refused on a node with a ",[514,1325,1248],{},". See ",[519,1328,1307],{"href":1329},"#read_only",[939,1331,1332,1337,1339,1341],{},[960,1333,1334],{},[514,1335,1336],{},"icon",[960,1338,966],{},[960,1340,983],{},[960,1342,1095,1343,1346],{},[519,1344,1336],{"href":1345},"#icons"," the board draws for the node.",[510,1348,1349,1350,1353,1354,1326,1357,524],{},"A recovery that concludes no repair can help reports ",[514,1351,1352],{},"failed"," with a\n",[514,1355,1356],{},"suggested_action",[519,1358,1356],{"href":1359},"\u002Freference\u002Fchain-nodes\u002Fresult-file#suggested_action",[1153,1361,1363],{"id":1362},"gate-node-keys","Gate node keys",[933,1365,1366,1378],{},[936,1367,1368],{},[939,1369,1370,1372,1374,1376],{},[942,1371,944],{},[942,1373,947],{},[942,1375,950],{},[942,1377,953],{},[955,1379,1380,1394,1411,1438,1453,1476,1499],{},[939,1381,1382,1387,1389,1391],{},[960,1383,1384],{},[514,1385,1386],{},"message",[960,1388,966],{},[960,1390,983],{},[960,1392,1393],{},"The text shown to a person deciding the gate.",[939,1395,1396,1401,1403,1405],{},[960,1397,1398],{},[514,1399,1400],{},"artifact",[960,1402,966],{},[960,1404,983],{},[960,1406,1407,1408,524],{},"The document the gate is decided on: a kind an earlier node ",[514,1409,1410],{},"produces",[939,1412,1413,1418,1420,1424],{},[960,1414,1415],{},[514,1416,1417],{},"artifact_required",[960,1419,1132],{},[960,1421,1422],{},[514,1423,1142],{},[960,1425,1426,1428,1429,1431,1432,1435,1436,524],{},[514,1427,1137],{}," refuses approval while the ",[514,1430,1400],{}," document is missing, with a ",[514,1433,1434],{},"422"," that says to retry the node that owes it. Needs an ",[514,1437,1400],{},[939,1439,1440,1445,1447,1450],{},[960,1441,1442],{},[514,1443,1444],{},"reject_to",[960,1446,966],{},[960,1448,1449],{},"see Meaning",[960,1451,1452],{},"The exec node a rejection re-enters, with the reviewer's note. It must be before the gate. Without it, a rejection re-enters the nearest exec node before the gate, or re-opens the gate when there is none.",[939,1454,1455,1460,1463,1465],{},[960,1456,1457],{},[514,1458,1459],{},"timeout",[960,1461,1462],{},"duration",[960,1464,983],{},[960,1466,1467,1468,1471,1472,1475],{},"How long the gate waits for a decision, such as ",[514,1469,1470],{},"90m",". It may not exceed the ",[514,1473,1474],{},"total_time_cap_minutes"," around it.",[939,1477,1478,1483,1485,1487],{},[960,1479,1480],{},[514,1481,1482],{},"auto_review",[960,1484,1010],{},[960,1486,983],{},[960,1488,1489,1490,1493,1494,1496,1497,524],{},"An agent task that may report a verdict first. It takes no ",[514,1491,1492],{},"fallback",", and may ",[514,1495,553],{}," a library task. See ",[519,1498,106],{"href":107},[939,1500,1501,1506,1508,1512],{},[960,1502,1503],{},[514,1504,1505],{},"chain_finalized",[960,1507,1132],{},[960,1509,1510],{},[514,1511,1142],{},[960,1513,1514,1516,1517,1519,1520,524],{},[514,1515,1137],{}," marks the final review. A ",[514,1518,1505],{}," gate always requires its document, whether or not it sets ",[514,1521,1417],{},[510,1523,1524,1525,524],{},"A gate takes no ",[514,1526,1336],{},[526,1528,1290],{"id":1290},[510,1530,1531,1533,1534,1537,1538,1541],{},[514,1532,1290],{}," goes on an exec node whose work can move the worktree's base\nbranch. The shipped ",[514,1535,1536],{},"default"," chain sets it on ",[514,1539,1540],{},"merge_request_feedback",":",[556,1543,1546],{"className":558,"code":1544,"filename":1545,"language":561,"meta":562,"style":562},"- id: merge_request_feedback\n  extends: post_draft_feedback\n  on_base_changed:\n    restart_from: verification\n","config\u002Fchains\u002Fdefault.yaml",[514,1547,1548,1560,1570,1577],{"__ignoreMap":562},[566,1549,1550,1553,1555,1557],{"class":568,"line":569},[566,1551,1552],{"class":576},"- ",[566,1554,573],{"class":572},[566,1556,577],{"class":576},[566,1558,1559],{"class":580},"merge_request_feedback\n",[566,1561,1562,1565,1567],{"class":568,"line":584},[566,1563,1564],{"class":572},"  extends",[566,1566,577],{"class":576},[566,1568,1569],{"class":580},"post_draft_feedback\n",[566,1571,1572,1575],{"class":568,"line":595},[566,1573,1574],{"class":572},"  on_base_changed",[566,1576,601],{"class":576},[566,1578,1579,1582,1584],{"class":568,"line":604},[566,1580,1581],{"class":572},"    restart_from",[566,1583,577],{"class":576},[566,1585,1586],{"class":580},"verification\n",[510,1588,1589,1590,1593,1594,1597],{},"When a rebase moves the base, Kraft re-runs the exec nodes from ",[514,1591,1592],{},"restart_from","\nthrough this node: the ",[519,1595,566],{"href":1596},"\u002Fconcepts\u002Fvocabulary#span",". A gate in that range\nkeeps its approval after a clean rebase. It reopens, and needs approving again,\nafter a rebase that needed a conflict resolved.",[933,1599,1600,1612],{},[936,1601,1602],{},[939,1603,1604,1606,1608,1610],{},[942,1605,944],{},[942,1607,947],{},[942,1609,950],{},[942,1611,953],{},[955,1613,1614,1627],{},[939,1615,1616,1620,1622,1624],{},[960,1617,1618],{},[514,1619,1592],{},[960,1621,966],{},[960,1623,924],{},[960,1625,1626],{},"Names this node or an earlier exec node, never a gate.",[939,1628,1629,1634,1636,1638],{},[960,1630,1631],{},[514,1632,1633],{},"on_conflict",[960,1635,1010],{},[960,1637,983],{},[960,1639,1640],{},"Names the task or steps that resolve a conflicting rebase.",[510,1642,1643,1644,1647,1648,1650],{},"If a retry or resume starts at a node that has its own ",[514,1645,1646],{},"mr_rebase"," task and an\n",[514,1649,1290],{},", that task does the rebase, and a changed base still re-runs\nthe span.",[526,1652,1654],{"id":1653},"step-keys","Step keys",[933,1656,1657,1669],{},[936,1658,1659],{},[939,1660,1661,1663,1665,1667],{},[942,1662,944],{},[942,1664,947],{},[942,1666,950],{},[942,1668,953],{},[955,1670,1671,1684,1700,1715,1728,1741,1758,1777],{},[939,1672,1673,1677,1679,1681],{},[960,1674,1675],{},[514,1676,573],{},[960,1678,966],{},[960,1680,924],{},[960,1682,1683],{},"The step's name, unique in the node.",[939,1685,1686,1690,1692,1694],{},[960,1687,1688],{},[514,1689,553],{},[960,1691,966],{},[960,1693,983],{},[960,1695,1696,1697,1699],{},"The library step this one builds on. Its tasks come from the library step unless this step sets ",[514,1698,1162],{},", which replace them.",[939,1701,1702,1706,1708,1712],{},[960,1703,1704],{},[514,1705,1162],{},[960,1707,995],{},[960,1709,1069,1710,1072],{},[514,1711,553],{},[960,1713,1714],{},"The step's tasks, dispatched together. At least one.",[939,1716,1717,1721,1723,1725],{},[960,1718,1719],{},[514,1720,1231],{},[960,1722,1010],{},[960,1724,983],{},[960,1726,1727],{},"A recovery pass for this step alone.",[939,1729,1730,1734,1736,1738],{},[960,1731,1732],{},[514,1733,1007],{},[960,1735,1010],{},[960,1737,983],{},[960,1739,1740],{},"This step's policy layer.",[939,1742,1743,1747,1749,1753],{},[960,1744,1745],{},[514,1746,1129],{},[960,1748,1132],{},[960,1750,1751],{},[514,1752,1137],{},[960,1754,1755,1757],{},[514,1756,1142],{}," refuses a skip of this step.",[939,1759,1760,1764,1766,1770],{},[960,1761,1762],{},[514,1763,1307],{},[960,1765,1132],{},[960,1767,1768],{},[514,1769,1142],{},[960,1771,1772,1774,1775,524],{},[514,1773,1137],{}," verifies the step's tasks leave the worktree as they found it. See ",[519,1776,1307],{"href":1329},[939,1778,1779,1783,1785,1787],{},[960,1780,1781],{},[514,1782,1336],{},[960,1784,966],{},[960,1786,983],{},[960,1788,1095,1789,1791],{},[519,1790,1336],{"href":1345}," the board draws for the step.",[526,1793,1795],{"id":1794},"task-keys","Task keys",[510,1797,1798,1799,1801],{},"Every task takes these keys, then the keys of its kind. A task takes no\n",[514,1800,1307],{},": set it on the step or node instead.",[933,1803,1804,1816],{},[936,1805,1806],{},[939,1807,1808,1810,1812,1814],{},[942,1809,944],{},[942,1811,947],{},[942,1813,950],{},[942,1815,953],{},[955,1817,1818,1834,1861,1874,1897,1922,1935,1952,1969],{},[939,1819,1820,1824,1826,1828],{},[960,1821,1822],{},[514,1823,573],{},[960,1825,966],{},[960,1827,924],{},[960,1829,1830,1831,1833],{},"The task's name (",[514,1832,1056],{},"), unique in the step. A library entry is named by its key instead.",[939,1835,1836,1840,1842,1846],{},[960,1837,1838],{},[514,1839,1064],{},[960,1841,966],{},[960,1843,1069,1844,1072],{},[514,1845,553],{},[960,1847,1848,1851,1852,1851,1855,1163,1858,524],{},[514,1849,1850],{},"agent",", ",[514,1853,1854],{},"subprocess",[514,1856,1857],{},"builtin",[514,1859,1860],{},"forge",[939,1862,1863,1867,1869,1871],{},[960,1864,1865],{},[514,1866,553],{},[960,1868,966],{},[960,1870,983],{},[960,1872,1873],{},"The library task this one builds on.",[939,1875,1876,1881,1883,1888],{},[960,1877,1878],{},[514,1879,1880],{},"scope",[960,1882,966],{},[960,1884,1885],{},[514,1886,1887],{},"once",[960,1889,1890,1893,1894,1896],{},[514,1891,1892],{},"each_repository"," runs the task once per selected repository of a workspace item. ",[514,1895,1887],{}," runs it once.",[939,1898,1899,1904,1906,1911],{},[960,1900,1901],{},[514,1902,1903],{},"steering",[960,1905,995],{},[960,1907,1908],{},[514,1909,1910],{},"[]",[960,1912,1913,1914,1918,1919,1921],{},"Names of ",[519,1915,1917],{"href":1916},"\u002Fconcepts\u002Fvocabulary#steering-profile","steering profiles"," from the library's ",[514,1920,1903],{}," section. Only an agent task reads it.",[939,1923,1924,1928,1930,1932],{},[960,1925,1926],{},[514,1927,1231],{},[960,1929,1010],{},[960,1931,983],{},[960,1933,1934],{},"A recovery pass for this task alone. Allowed only on a task in one of an exec node's own steps.",[939,1936,1937,1941,1943,1945],{},[960,1938,1939],{},[514,1940,1007],{},[960,1942,1010],{},[960,1944,983],{},[960,1946,1947,1948,524],{},"This task's own policy layer. See ",[519,1949,1951],{"href":1950},"#what-a-tasks-policy-does","What a task's policy does",[939,1953,1954,1958,1960,1964],{},[960,1955,1956],{},[514,1957,1129],{},[960,1959,1132],{},[960,1961,1962],{},[514,1963,1137],{},[960,1965,1966,1968],{},[514,1967,1142],{}," refuses a skip of this task.",[939,1970,1971,1975,1977,1979],{},[960,1972,1973],{},[514,1974,1336],{},[960,1976,966],{},[960,1978,983],{},[960,1980,1095,1981,1983,1984,1986],{},[519,1982,1336],{"href":1345}," the board draws for the task. Refused on a fix loop's ",[514,1985,541],{},", whose icon is fixed.",[1153,1988,1951],{"id":1989},"what-a-tasks-policy-does",[1991,1992,1993,2009],"ul",{},[1994,1995,1996,1997,2000,2001,1851,2004,546,2006,524],"li",{},"On a subprocess, builtin or ",[519,1998,1860],{"href":1999},"\u002Fconcepts\u002Fvocabulary#forge"," task, the layer's own effect is\n",[514,2002,2003],{},"time_cap_minutes",[514,2005,1474],{},[514,2007,2008],{},"sandbox",[1994,2010,2011,2012,2016,2017,2019],{},"Its other caps (",[519,2013,2015],{"href":2014},"\u002Fconcepts\u002Fvocabulary#harness","harness",", budget, tools and grants) apply to the agent that runs\nthis task's ",[514,2018,1231],{}," recovery.",[1153,2021,2023],{"id":2022},"agent-task-keys","Agent task keys",[510,2025,2026,2029],{},[514,2027,2028],{},"kind: agent"," runs a headless coding agent in the item's worktree.",[933,2031,2032,2044],{},[936,2033,2034],{},[939,2035,2036,2038,2040,2042],{},[942,2037,944],{},[942,2039,947],{},[942,2041,950],{},[942,2043,953],{},[955,2045,2046,2068,2082,2112,2144,2175,2197,2217],{},[939,2047,2048,2052,2054,2056],{},[960,2049,2050],{},[514,2051,2015],{},[960,2053,966],{},[960,2055,924],{},[960,2057,1095,2058,2062,2063,2065,2066,524],{},[519,2059,2061],{"href":2060},"\u002Fconcepts\u002Fvocabulary#harness-profile","harness profile"," to run on, an ID from ",[514,2064,318],{},". A missing or disabled harness profile stops the task and waits for you unless the task declares ",[514,2067,1492],{},[939,2069,2070,2075,2077,2079],{},[960,2071,2072],{},[514,2073,2074],{},"prompt",[960,2076,966],{},[960,2078,924],{},[960,2080,2081],{},"What the task is asked to do. Kraft's output contract comes before the skill and steering.",[939,2083,2084,2089,2091,2093],{},[960,2085,2086],{},[514,2087,2088],{},"skill",[960,2090,966],{},[960,2092,983],{},[960,2094,2095,2096,2099,2100,2103,2104,2107,2108,2111],{},"One skill to launch the agent with (",[514,2097,2098],{},"kraft:code-review",", or a plugin's ",[514,2101,2102],{},"plugin:skill","). The shipped ",[514,2105,2106],{},"spec_author"," sets ",[514,2109,2110],{},"kraft:spec",", for example. A skill that cannot load stops the task and waits for you.",[939,2113,2114,2118,2120,2122],{},[960,2115,2116],{},[514,2117,1410],{},[960,2119,966],{},[960,2121,983],{},[960,2123,2124,2125,1851,2128,1851,2131,1851,2134,1851,2137,546,2140,2143],{},"The document kind the task writes (the shipped library uses ",[514,2126,2127],{},"spec",[514,2129,2130],{},"plan",[514,2132,2133],{},"chain_revision",[514,2135,2136],{},"mr_meta",[514,2138,2139],{},"work_brief",[514,2141,2142],{},"review_brief",").",[939,2145,2146,2151,2153,2155],{},[960,2147,2148],{},[514,2149,2150],{},"profile",[960,2152,966],{},[960,2154,983],{},[960,2156,2157,2158,2161,2162,2164,2165,2168,2169,1163,2172,524],{},"An ",[519,2159,2160],{"href":405},"agent profile"," from ",[514,2163,318],{}," (",[514,2166,2167],{},"strong",") that sets the model tier. Not allowed with ",[514,2170,2171],{},"model",[514,2173,2174],{},"effort",[939,2176,2177,2183,2185,2187],{},[960,2178,2179,1851,2181],{},[514,2180,2171],{},[514,2182,2174],{},[960,2184,966],{},[960,2186,983],{},[960,2188,2189,2190,2194,2195,524],{},"This task's runtime options, checked against what the ",[519,2191,2193],{"href":2192},"\u002Fconcepts\u002Fvocabulary#provider","provider"," of the task's harness profile accepts. Not allowed with ",[514,2196,2150],{},[939,2198,2199,2203,2205,2208],{},[960,2200,2201],{},[514,2202,1492],{},[960,2204,995],{},[960,2206,2207],{},"unset",[960,2209,2210,2211,2213,2214,524],{},"Where the launch goes when it is rate-limited or its harness is unavailable. ",[514,2212,1910],{}," means none. See ",[519,2215,2216],{"href":413},"Fallback",[939,2218,2219,2224,2226,2230],{},[960,2220,2221],{},[514,2222,2223],{},"inputs",[960,2225,995],{},[960,2227,2228],{},[514,2229,1910],{},[960,2231,2232,2233,1851,2236,1163,2239,524],{},"What Kraft hands the task: ",[514,2234,2235],{},"review_package",[514,2237,2238],{},"carried_findings",[514,2240,2241],{},"previous_review",[1153,2243,2245],{"id":2244},"subprocess-task-keys","Subprocess task keys",[510,2247,2248,2251],{},[514,2249,2250],{},"kind: subprocess"," runs one command in the item's worktree.",[933,2253,2254,2266],{},[936,2255,2256],{},[939,2257,2258,2260,2262,2264],{},[942,2259,944],{},[942,2261,947],{},[942,2263,950],{},[942,2265,953],{},[955,2267,2268],{},[939,2269,2270,2275,2277,2279],{},[960,2271,2272],{},[514,2273,2274],{},"command",[960,2276,966],{},[960,2278,924],{},[960,2280,2281,2282,2285,2286,2289,2290,1326,2293,524],{},"The command to run in the worktree. It is split into arguments like a shell would, but runs with no shell, so ",[514,2283,2284],{},"&&"," and pipes need ",[514,2287,2288],{},"sh -c '...'",". Exit 0 is ",[514,2291,2292],{},"done",[519,2294,382],{"href":383},[1153,2296,2298],{"id":2297},"builtin-task-keys","Builtin task keys",[510,2300,2301,2304],{},[514,2302,2303],{},"kind: builtin"," is work Kraft does itself.",[933,2306,2307,2319],{},[936,2308,2309],{},[939,2310,2311,2313,2315,2317],{},[942,2312,944],{},[942,2314,947],{},[942,2316,950],{},[942,2318,953],{},[955,2320,2321,2346],{},[939,2322,2323,2328,2330,2332],{},[960,2324,2325],{},[514,2326,2327],{},"ref",[960,2329,966],{},[960,2331,924],{},[960,2333,2334,2337,2338,2341,2342,524],{},[514,2335,2336],{},"kraft.verify_changed_test_scopes"," runs the repo's own test scopes. ",[514,2339,2340],{},"kraft.mr_rebase"," rebases the worktree onto the item's ",[519,2343,2345],{"href":2344},"\u002Fconcepts\u002Fvocabulary#base-branch","base branch",[939,2347,2348,2353,2355,2360],{},[960,2349,2350],{},[514,2351,2352],{},"execution",[960,2354,966],{},[960,2356,2357],{},[514,2358,2359],{},"sequential",[960,2361,2362,1163,2364,524],{},[514,2363,2359],{},[514,2365,2366],{},"parallel",[1153,2368,2370],{"id":2369},"forge-task-keys","Forge task keys",[510,2372,2373,2376,2377,2379,2380,2382],{},[514,2374,2375],{},"kind: forge"," is a merge-request action on GitHub or GitLab, resolved from the\n",[514,2378,1860],{}," in the repo's ",[514,2381,292],{}," entry.",[933,2384,2385,2397],{},[936,2386,2387],{},[939,2388,2389,2391,2393,2395],{},[942,2390,944],{},[942,2392,947],{},[942,2394,950],{},[942,2396,953],{},[955,2398,2399,2436],{},[939,2400,2401,2406,2408,2410],{},[960,2402,2403],{},[514,2404,2405],{},"target",[960,2407,966],{},[960,2409,924],{},[960,2411,2412,1851,2415,1851,2418,1851,2421,1851,2424,1851,2427,1851,2430,1163,2433,524],{},[514,2413,2414],{},"mr.open_draft",[514,2416,2417],{},"mr.sync",[514,2419,2420],{},"mr.ci",[514,2422,2423],{},"mr.automated_review",[514,2425,2426],{},"mr.mark_ready",[514,2428,2429],{},"mr.external_approval",[514,2431,2432],{},"mr.merge",[514,2434,2435],{},"mr.post_merge_ci",[939,2437,2438,2443,2445,2447],{},[960,2439,2440],{},[514,2441,2442],{},"wait",[960,2444,1010],{},[960,2446,983],{},[960,2448,2449,2450,2453,2454,2457,2458,2461,2462,524],{},"For a target that waits: ",[514,2451,2452],{},"polling",", with an ",[514,2455,2456],{},"initial_interval"," and a ",[514,2459,2460],{},"max_interval",". Set the timeout with the task's ",[514,2463,1007],{},[556,2465,2467],{"className":558,"code":2466,"language":561,"meta":562,"style":562},"wait: {polling: {initial_interval: 30s, max_interval: 5m}}\npolicy: {total_time_cap_minutes: 90}\n",[514,2468,2469,2499],{"__ignoreMap":562},[566,2470,2471,2473,2476,2478,2480,2482,2484,2487,2489,2491,2493,2496],{"class":568,"line":569},[566,2472,2442],{"class":572},[566,2474,2475],{"class":576},": {",[566,2477,2452],{"class":572},[566,2479,2475],{"class":576},[566,2481,2456],{"class":572},[566,2483,577],{"class":576},[566,2485,2486],{"class":580},"30s",[566,2488,1851],{"class":576},[566,2490,2460],{"class":572},[566,2492,577],{"class":576},[566,2494,2495],{"class":580},"5m",[566,2497,2498],{"class":576},"}}\n",[566,2500,2501,2503,2505,2507,2509,2512],{"class":568,"line":584},[566,2502,1007],{"class":572},[566,2504,2475],{"class":576},[566,2506,1474],{"class":572},[566,2508,577],{"class":576},[566,2510,2511],{"class":669},"90",[566,2513,2514],{"class":576},"}\n",[526,2516,1307],{"id":1307},[510,2518,2519,2521],{},[514,2520,1307],{}," goes on a step or an exec node, never on a task. A task that sets it\nis refused at load.",[1991,2523,2524,2541,2547,2557,2570,2581],{},[1994,2525,2526,2529,2530,1851,2533,2536,2537,2540],{},[2167,2527,2528],{},"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",[514,2531,2532],{},"HEAD",[514,2534,2535],{},"git status --porcelain=v1 -z"," (ignored files stay out), and a hash of\n",[514,2538,2539],{},"git diff HEAD",". It reads them again after the last task exits. A read_only\nnode does the same around all of its steps.",[1994,2542,2543,2546],{},[2167,2544,2545],{},"What counts as a change."," Any difference, including an untracked file or a\ncommit.",[1994,2548,2549,2552,2553,2556],{},[2167,2550,2551],{},"What happens."," The item stops and waits for you, with a ",[514,2554,2555],{},"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.",[1994,2558,2559,2562,2563,2565,2566,1143,2568,524],{},[2167,2560,2561],{},"Exclusions."," The check does not run during a recovery or a fix loop. It runs\nagain when a recovery retries the step's tasks. A step inside an ",[514,2564,1231],{}," or\na ",[514,2567,1248],{},[514,2569,1307],{},[1994,2571,2572,2575,2576,2580],{},[2167,2573,2574],{},"Sandboxed items."," In a ",[519,2577,2579],{"href":2578},"\u002Fconcepts\u002Fvocabulary#sandbox","sandboxed"," item, if the worktree gains a repository\nKraft did not create, Kraft runs no host git there and reports that repository\nas the change.",[1994,2582,2583,2586],{},[2167,2584,2585],{},"Default."," Off. No shipped chain sets it. Setting it on both a node and its\nsteps is allowed and redundant.",[526,2588,2590],{"id":2589},"icons","Icons",[510,2592,2157,2593,2595,2596,2602,2603,1163,2606,2609],{},[514,2594,1336],{}," is the kebab-case name of a ",[519,2597,2601],{"href":2598,"rel":2599},"https:\u002F\u002Flucide.dev\u002Ficons",[2600],"nofollow","Lucide"," icon,\nsuch as ",[514,2604,2605],{},"file-text",[514,2607,2608],{},"circle-check",". It is optional on an exec node, a step\nand a task, library components included. A name that is not kebab-case is a\nschema error.",[510,2611,2612,2613,2615,2616,2619],{},"A kebab-case name that Kraft's Lucide version does not have still loads, and\nthe chain runs. ",[514,2614,920],{}," and a draft's problems report it\nas ",[514,2617,2618],{},"unknown icon",", at the component that sets it, and a save in Templates › Chains\nor Library refuses it like any other issue. The board draws the kind's default\nicon in its place.",[526,2621,2623],{"id":2622},"the-library-and-extends","The library and extends",[510,2625,2626,2629,2630,1851,2632,1851,2634,2636,2637,2639,2640,524],{},[514,2627,2628],{},"config\u002Flibrary.yaml"," holds reusable ",[514,2631,1162],{},[514,2633,1166],{},[514,2635,598],{},", and named\n",[514,2638,1903],{}," profiles (the named guidance a task or a repository selects). A chain component takes one with ",[514,2641,2642],{},"extends: \u003Cname>",[1991,2644,2645,2648,2651,2657],{},[1994,2646,2647],{},"A component extends one parent of its own kind. A node extends a node, never a\ntask.",[1994,2649,2650],{},"Maps merge recursively. Lists replace.",[1994,2652,2653,2654,2656],{},"A reference that resolves to nothing is an error naming the file it came from.\n",[514,2655,920],{}," reports every one.",[1994,2658,2659,2662],{},[514,2660,2661],{},"kraft admin templates show ID --resolved"," prints a chain with every library\ncomponent expanded.",[510,2664,2665,2667],{},[519,2666,314],{"href":315}," lists the\nlibrary's sections and has examples of each.",[526,2669,2671],{"id":2670},"canonical-paths","Canonical paths",[510,2673,2674,2675,1851,2678,2681,2682,2685,2686,2689,2690,2693],{},"Every task, step, and node has a canonical path, for example\n",[514,2676,2677],{},"spec.main.author",[514,2679,2680],{},"verification.review.code_review",", or\n",[514,2683,2684],{},"merge_request_feedback.fix_loop.judge",". Events, sessions,\n",[514,2687,2688],{},"kraft item retry --path",", and ",[514,2691,2692],{},"kraft item skip --path"," address work by it.",[526,2695,2697],{"id":2696},"in-this-section","In this section",[1991,2699,2700,2705,2710],{},[1994,2701,2702,2704],{},[519,2703,382],{"href":383},": what Kraft passes a command, and how its exit code becomes a status.",[1994,2706,2707,2709],{},[519,2708,386],{"href":387},": when a fix loop opens, what each cycle does, and what the judge's verdicts mean.",[1994,2711,2712,2714,2715,2718],{},[519,2713,390],{"href":391},": the JSON a task writes at ",[514,2716,2717],{},"$KRAFT_RESULT_PATH",", field by field.",[2720,2721,2722],"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 .semJd, html code.shiki .semJd{--shiki-light:#032563;--shiki-default:#032563;--shiki-dark:#ADDCFF}html pre.shiki code .sq92B, html code.shiki .sq92B{--shiki-light:#66707B;--shiki-default:#66707B;--shiki-dark:#BDC4CC}html pre.shiki code .ssYy9, html code.shiki .ssYy9{--shiki-light:#023B95;--shiki-default:#023B95;--shiki-dark:#91CBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":562,"searchDepth":584,"depth":584,"links":2724},[2725,2726,2727,2731,2733,2734,2741,2743,2744,2745,2746],{"id":528,"depth":584,"text":529},{"id":930,"depth":584,"text":931},{"id":1020,"depth":584,"text":1021,"children":2728},[2729,2730],{"id":1155,"depth":595,"text":1156},{"id":1362,"depth":595,"text":1363},{"id":1290,"depth":584,"text":2732},"on_​base_​changed",{"id":1653,"depth":584,"text":1654},{"id":1794,"depth":584,"text":1795,"children":2735},[2736,2737,2738,2739,2740],{"id":1989,"depth":595,"text":1951},{"id":2022,"depth":595,"text":2023},{"id":2244,"depth":595,"text":2245},{"id":2297,"depth":595,"text":2298},{"id":2369,"depth":595,"text":2370},{"id":1307,"depth":584,"text":2742},"read_​only",{"id":2589,"depth":584,"text":2590},{"id":2622,"depth":584,"text":2623},{"id":2670,"depth":584,"text":2671},{"id":2696,"depth":584,"text":2697},"Every key a chain file accepts, from the chain down to each kind of task, plus read_only, extends, icons and canonical paths.","md",null,{},{"title":10},{"title":376,"description":2747},"39clMy_dF1AKA0RqL5yNH1aTnT1EXIVgvpbPLVoQ_5w",[2755,2757],{"title":372,"path":373,"stem":374,"description":2756,"children":-1},"Every KRAFT_* variable Kraft reads or sets, the other variables it reads, and the variables a worker's environment gets.",{"title":382,"path":383,"stem":384,"description":2758,"children":-1},"What Kraft passes a subprocess task, how it runs, and how its exit code and result file become a status.",1791801257514]