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