[{"data":1,"prerenderedAt":1689},["ShallowReactive",2],{"navigation_docs":3,"-guides-customize-write-your-own-chain":520,"-guides-customize-write-your-own-chain-surround":1684},[4,28,51,191,222,485],{"title":5,"path":6,"stem":7,"children":8,"page":-1},"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,"page":-1},"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,"page":-1},"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,"page":-1},"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,"page":-1},"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,"page":-1},"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,"page":-1},"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,"page":-1},"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,"page":-1},"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,"page":-1},"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,"page":-1},"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,"page":-1},"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,"page":-1},"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,"page":-1},"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":102,"body":522,"description":1677,"extension":1678,"links":1679,"meta":1680,"navigation":1681,"path":103,"seo":1682,"stem":104,"__hash__":1683},"docs\u002F3.guides\u002F2.customize\u002F1.write-your-own-chain.md",{"type":523,"value":524,"toc":1667},"minimark",[525,542,654,659,695,699,709,804,822,836,840,852,1015,1018,1098,1102,1113,1163,1183,1319,1327,1331,1375,1378,1402,1454,1458,1461,1485,1491,1526,1530,1533,1623,1627,1663],[526,527,528,529,533,534,537,538,541],"p",{},"You will have a chain of your own: a copy of the shipped ",[530,531,532],"code",{},"default"," chain with a\n",[530,535,536],{},"lint"," node after ",[530,539,540],{},"verification",". The node runs your linter. When the linter\nfails, an agent fixes what it reported and the linter runs again, with a time\ncap, and nobody can skip it.",[543,544,545,564,641],"note",{},[526,546,547,548,551,552,554,555,557,558,563],{},"If you only need lint to run when certain files change, you do not need a node.\nAdd the linter to the repo's ",[530,549,550],{},"test_scopes"," in ",[530,553,300],{},". The shipped\n",[530,556,540],{}," node runs every scope whose paths the change touches, and its\n",[559,560,562],"a",{"href":561},"\u002Fconcepts\u002Fvocabulary#fix-loop","fix loop"," repairs the failures:",[565,566,572],"pre",{"className":567,"code":568,"filename":569,"language":570,"meta":571,"style":571},"language-yaml shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","test_scopes:\n  - paths: [\"src\u002F**\"]\n    command: npm test\n  - paths: [\"src\u002F**\u002F*.ts\"]\n    command: sh -c 'npm run lint && npx tsc --noEmit'\n","config\u002Frepos.yaml","yaml","",[530,573,574,586,605,617,631],{"__ignoreMap":571},[575,576,579,582],"span",{"class":577,"line":578},"line",1,[575,580,550],{"class":581},"sb7M8",[575,583,585],{"class":584},"s7iLA",":\n",[575,587,589,592,595,598,602],{"class":577,"line":588},2,[575,590,591],{"class":584},"  - ",[575,593,594],{"class":581},"paths",[575,596,597],{"class":584},": [",[575,599,601],{"class":600},"semJd","\"src\u002F**\"",[575,603,604],{"class":584},"]\n",[575,606,608,611,614],{"class":577,"line":607},3,[575,609,610],{"class":581},"    command",[575,612,613],{"class":584},": ",[575,615,616],{"class":600},"npm test\n",[575,618,620,622,624,626,629],{"class":577,"line":619},4,[575,621,591],{"class":584},[575,623,594],{"class":581},[575,625,597],{"class":584},[575,627,628],{"class":600},"\"src\u002F**\u002F*.ts\"",[575,630,604],{"class":584},[575,632,634,636,638],{"class":577,"line":633},5,[575,635,610],{"class":581},[575,637,613],{"class":584},[575,639,640],{"class":600},"sh -c 'npm run lint && npx tsc --noEmit'\n",[526,642,643,644,647,648,653],{},"A scope's ",[530,645,646],{},"command"," runs with no shell too. See\n",[559,649,651],{"href":650},"\u002Freference\u002Fconfiguration\u002Frepos#test_scopes",[530,652,550],{},".",[655,656,658],"h2",{"id":657},"before-you-start","Before you start",[660,661,662,666,673],"ul",{},[663,664,665],"li",{},"A running Kraft server and a connected repo.",[663,667,668,669,672],{},"A lint command that exits 0 when the code is clean. This guide uses\n",[530,670,671],{},"npm run lint && npx tsc --noEmit",". Use your own.",[663,674,675,676,679,680,683,684,687,688,691,692,653],{},"Your config directory: ",[530,677,678],{},"~\u002F.kraft\u002Fconfig\u002F",", or ",[530,681,682],{},"$KRAFT_HOME\u002Fconfig\u002F"," if you set\n",[530,685,686],{},"KRAFT_HOME",". You edit ",[530,689,690],{},"library.yaml"," in it and add a file under ",[530,693,694],{},"chains\u002F",[655,696,698],{"id":697},"_1-add-the-tasks-to-the-library","1. Add the tasks to the library",[526,700,701,702,704,705,708],{},"Add two tasks to ",[530,703,690],{},", under ",[530,706,707],{},"tasks:",". One runs the linter. The other\nis the agent that repairs what the linter reports.",[565,710,713],{"className":567,"code":711,"filename":712,"language":570,"meta":571,"style":571},"tasks:\n  lint:\n    kind: subprocess\n    command: sh -c 'npm run lint && npx tsc --noEmit'\n\n  repair_lint:\n    kind: agent\n    harness: claude\n    profile: strong\n    prompt: Fix the lint and type errors the lint step reported. Change no behavior.\n","config\u002Flibrary.yaml",[530,714,715,722,729,739,747,753,761,771,782,793],{"__ignoreMap":571},[575,716,717,720],{"class":577,"line":578},[575,718,719],{"class":581},"tasks",[575,721,585],{"class":584},[575,723,724,727],{"class":577,"line":588},[575,725,726],{"class":581},"  lint",[575,728,585],{"class":584},[575,730,731,734,736],{"class":577,"line":607},[575,732,733],{"class":581},"    kind",[575,735,613],{"class":584},[575,737,738],{"class":600},"subprocess\n",[575,740,741,743,745],{"class":577,"line":619},[575,742,610],{"class":581},[575,744,613],{"class":584},[575,746,640],{"class":600},[575,748,749],{"class":577,"line":633},[575,750,752],{"emptyLinePlaceholder":751},true,"\n",[575,754,756,759],{"class":577,"line":755},6,[575,757,758],{"class":581},"  repair_lint",[575,760,585],{"class":584},[575,762,764,766,768],{"class":577,"line":763},7,[575,765,733],{"class":581},[575,767,613],{"class":584},[575,769,770],{"class":600},"agent\n",[575,772,774,777,779],{"class":577,"line":773},8,[575,775,776],{"class":581},"    harness",[575,778,613],{"class":584},[575,780,781],{"class":600},"claude\n",[575,783,785,788,790],{"class":577,"line":784},9,[575,786,787],{"class":581},"    profile",[575,789,613],{"class":584},[575,791,792],{"class":600},"strong\n",[575,794,796,799,801],{"class":577,"line":795},10,[575,797,798],{"class":581},"    prompt",[575,800,613],{"class":584},[575,802,803],{"class":600},"Fix the lint and type errors the lint step reported. Change no behavior.\n",[526,805,806,807,809,810,813,814,817,818,821],{},"Kraft does not run ",[530,808,646],{}," through a shell, so ",[530,811,812],{},"&&"," and pipes need the\n",[530,815,816],{},"sh -c '...'"," wrapper. A failing lint becomes a ",[530,819,820],{},"critical"," finding that holds the\nend of the command's output, and the repair agent reads it.",[526,823,824,825,828,829,831,832,835],{},"Inside a fix loop, Kraft replaces the repair task's ",[530,826,827],{},"prompt"," with its own\ninstruction. See ",[559,830,398],{"href":399}," for\nhow the command runs and how its exit code becomes a status, and\n",[559,833,402],{"href":834},"\u002Freference\u002Fchain-nodes\u002Ffix-loop#what-a-repair-task-is-told","\nfor what the repair agent is told.",[655,837,839],{"id":838},"_2-add-the-node-to-the-library","2. Add the node to the library",[526,841,842,843,845,846,704,848,851],{},"Add a ",[530,844,536],{}," node to ",[530,847,690],{},[530,849,850],{},"nodes:",":",[565,853,855],{"className":567,"code":854,"filename":712,"language":570,"meta":571,"style":571},"nodes:\n  lint:\n    kind: exec\n    skippable: false\n    policy:\n      time_cap_minutes: 30\n    tasks:\n      - id: lint\n        extends: lint\n    fix_loop:\n      tasks:\n        - id: repair\n          extends: repair_lint\n      judge:\n        id: judge\n        extends: strict_judge\n      max_attempts: 3\n",[530,856,857,864,870,879,890,897,907,914,927,936,943,951,964,975,983,994,1004],{"__ignoreMap":571},[575,858,859,862],{"class":577,"line":578},[575,860,861],{"class":581},"nodes",[575,863,585],{"class":584},[575,865,866,868],{"class":577,"line":588},[575,867,726],{"class":581},[575,869,585],{"class":584},[575,871,872,874,876],{"class":577,"line":607},[575,873,733],{"class":581},[575,875,613],{"class":584},[575,877,878],{"class":600},"exec\n",[575,880,881,884,886],{"class":577,"line":619},[575,882,883],{"class":581},"    skippable",[575,885,613],{"class":584},[575,887,889],{"class":888},"ssYy9","false\n",[575,891,892,895],{"class":577,"line":633},[575,893,894],{"class":581},"    policy",[575,896,585],{"class":584},[575,898,899,902,904],{"class":577,"line":755},[575,900,901],{"class":581},"      time_cap_minutes",[575,903,613],{"class":584},[575,905,906],{"class":888},"30\n",[575,908,909,912],{"class":577,"line":763},[575,910,911],{"class":581},"    tasks",[575,913,585],{"class":584},[575,915,916,919,922,924],{"class":577,"line":773},[575,917,918],{"class":584},"      - ",[575,920,921],{"class":581},"id",[575,923,613],{"class":584},[575,925,926],{"class":600},"lint\n",[575,928,929,932,934],{"class":577,"line":784},[575,930,931],{"class":581},"        extends",[575,933,613],{"class":584},[575,935,926],{"class":600},[575,937,938,941],{"class":577,"line":795},[575,939,940],{"class":581},"    fix_loop",[575,942,585],{"class":584},[575,944,946,949],{"class":577,"line":945},11,[575,947,948],{"class":581},"      tasks",[575,950,585],{"class":584},[575,952,954,957,959,961],{"class":577,"line":953},12,[575,955,956],{"class":584},"        - ",[575,958,921],{"class":581},[575,960,613],{"class":584},[575,962,963],{"class":600},"repair\n",[575,965,967,970,972],{"class":577,"line":966},13,[575,968,969],{"class":581},"          extends",[575,971,613],{"class":584},[575,973,974],{"class":600},"repair_lint\n",[575,976,978,981],{"class":577,"line":977},14,[575,979,980],{"class":581},"      judge",[575,982,585],{"class":584},[575,984,986,989,991],{"class":577,"line":985},15,[575,987,988],{"class":581},"        id",[575,990,613],{"class":584},[575,992,993],{"class":600},"judge\n",[575,995,997,999,1001],{"class":577,"line":996},16,[575,998,931],{"class":581},[575,1000,613],{"class":584},[575,1002,1003],{"class":600},"strict_judge\n",[575,1005,1007,1010,1012],{"class":577,"line":1006},17,[575,1008,1009],{"class":581},"      max_attempts",[575,1011,613],{"class":584},[575,1013,1014],{"class":888},"3\n",[526,1016,1017],{},"What each key does:",[660,1019,1020,1033,1043,1077],{},[663,1021,1022,1025,1026,1029,1030,653],{},[530,1023,1024],{},"skippable: false",": refuses ",[530,1027,1028],{},"kraft item skip"," on this node, a chain revision\nthat proposes skipping it, and ",[530,1031,1032],{},"kraft item create --skip-nodes lint",[663,1034,1035,1038,1039,653],{},[530,1036,1037],{},"policy.time_cap_minutes: 30",": caps the node's running time, fix loop\nincluded. Hitting it stops the item and waits for you. Kraft does not count it\nas a lint failure, so no repair attempt is spent. See\n",[559,1040,1042],{"href":1041},"\u002Fconcepts\u002Fcaps-and-budgets#time-caps","Time caps",[663,1044,1045,1048,1049,1052,1053,1057,1058,1062,1063,1065,1066,679,1068,1071,1072,1074,1075,653],{},[530,1046,1047],{},"fix_loop.tasks",": runs after a failing lint, then the lint runs again. The loop\nrepeats until lint passes or ",[530,1050,1051],{},"max_attempts"," runs out. Then the node is ",[559,1054,1056],{"href":1055},"\u002Fconcepts\u002Fvocabulary#stuck","stuck",": an\n",[559,1059,1061],{"href":1060},"\u002Fconcepts\u002Fhow-a-work-item-runs#inside-a-node","escalation"," turn tries first, then\nthe item stops and waits for you. The loop's wall clock comes from ",[530,1064,318],{},"\n(",[530,1067,532],{},[530,1069,1070],{},"loops.lint.fix_loop","). See\n",[559,1073,402],{"href":403}," and\n",[559,1076,318],{"href":319},[663,1078,1079,1082,1083,1086,1087,1090,1091,1093,1094,653],{},[530,1080,1081],{},"judge",": optional. ",[530,1084,1085],{},"strict_judge"," is the ",[559,1088,1081],{"href":1089},"\u002Fconcepts\u002Fvocabulary#judge"," task the shipped library\nprovides, the one ",[530,1092,540],{}," uses. See\n",[559,1095,1097],{"href":1096},"\u002Freference\u002Fchain-nodes\u002Ffix-loop#the-judge","The judge",[655,1099,1101],{"id":1100},"_3-make-the-chain","3. Make the chain",[526,1103,1104,1105,1108,1109,1112],{},"Copy the default chain and give the copy its own id. ",[530,1106,1107],{},"cp -n"," never overwrites a file, so run it once: if ",[530,1110,1111],{},"chains\u002Fwith-lint.yaml"," exists, skip the copy and keep editing it.",[565,1114,1118],{"className":1115,"code":1116,"language":1117,"meta":571,"style":571},"language-bash shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","cd \"${KRAFT_HOME:-$HOME\u002F.kraft}\u002Fconfig\"\ncp -n chains\u002Fdefault.yaml chains\u002Fwith-lint.yaml\n","bash",[530,1119,1120,1148],{"__ignoreMap":571},[575,1121,1122,1125,1128,1130,1134,1137,1140,1142,1145],{"class":577,"line":578},[575,1123,1124],{"class":888},"cd",[575,1126,1127],{"class":600}," \"${",[575,1129,686],{"class":584},[575,1131,1133],{"class":1132},"sklAV",":-",[575,1135,1136],{"class":584},"$HOME",[575,1138,1139],{"class":1132},"\u002F",[575,1141,653],{"class":600},[575,1143,1144],{"class":584},"kraft",[575,1146,1147],{"class":600},"}\u002Fconfig\"\n",[575,1149,1150,1154,1157,1160],{"class":577,"line":588},[575,1151,1153],{"class":1152},"szw1H","cp",[575,1155,1156],{"class":888}," -n",[575,1158,1159],{"class":600}," chains\u002Fdefault.yaml",[575,1161,1162],{"class":600}," chains\u002Fwith-lint.yaml\n",[526,1164,1165,1166,1168,1169,1172,1173,1176,1177,1179,1180,1182],{},"In ",[530,1167,1111],{},", change ",[530,1170,1171],{},"id: default"," to ",[530,1174,1175],{},"id: with-lint",". Then add the\n",[530,1178,536],{}," node right after ",[530,1181,540],{},". The finished file, with the unchanged\nnodes left out:",[565,1184,1187],{"className":567,"code":1185,"filename":1186,"language":570,"meta":571,"style":571},"id: with-lint\n\nnodes:\n  # ... spec through implementation, unchanged\n\n  - id: verification\n    extends: verification\n\n  - id: lint\n    extends: lint\n\n  - id: work_brief\n    kind: exec\n    tasks:\n      - id: author\n        extends: write_work_brief\n\n  # ... the rest, unchanged\n","config\u002Fchains\u002Fwith-lint.yaml",[530,1188,1189,1198,1202,1208,1214,1218,1229,1238,1242,1252,1260,1264,1275,1283,1289,1300,1309,1313],{"__ignoreMap":571},[575,1190,1191,1193,1195],{"class":577,"line":578},[575,1192,921],{"class":581},[575,1194,613],{"class":584},[575,1196,1197],{"class":600},"with-lint\n",[575,1199,1200],{"class":577,"line":588},[575,1201,752],{"emptyLinePlaceholder":751},[575,1203,1204,1206],{"class":577,"line":607},[575,1205,861],{"class":581},[575,1207,585],{"class":584},[575,1209,1210],{"class":577,"line":619},[575,1211,1213],{"class":1212},"sq92B","  # ... spec through implementation, unchanged\n",[575,1215,1216],{"class":577,"line":633},[575,1217,752],{"emptyLinePlaceholder":751},[575,1219,1220,1222,1224,1226],{"class":577,"line":755},[575,1221,591],{"class":584},[575,1223,921],{"class":581},[575,1225,613],{"class":584},[575,1227,1228],{"class":600},"verification\n",[575,1230,1231,1234,1236],{"class":577,"line":763},[575,1232,1233],{"class":581},"    extends",[575,1235,613],{"class":584},[575,1237,1228],{"class":600},[575,1239,1240],{"class":577,"line":773},[575,1241,752],{"emptyLinePlaceholder":751},[575,1243,1244,1246,1248,1250],{"class":577,"line":784},[575,1245,591],{"class":584},[575,1247,921],{"class":581},[575,1249,613],{"class":584},[575,1251,926],{"class":600},[575,1253,1254,1256,1258],{"class":577,"line":795},[575,1255,1233],{"class":581},[575,1257,613],{"class":584},[575,1259,926],{"class":600},[575,1261,1262],{"class":577,"line":945},[575,1263,752],{"emptyLinePlaceholder":751},[575,1265,1266,1268,1270,1272],{"class":577,"line":953},[575,1267,591],{"class":584},[575,1269,921],{"class":581},[575,1271,613],{"class":584},[575,1273,1274],{"class":600},"work_brief\n",[575,1276,1277,1279,1281],{"class":577,"line":966},[575,1278,733],{"class":581},[575,1280,613],{"class":584},[575,1282,878],{"class":600},[575,1284,1285,1287],{"class":577,"line":977},[575,1286,911],{"class":581},[575,1288,585],{"class":584},[575,1290,1291,1293,1295,1297],{"class":577,"line":985},[575,1292,918],{"class":584},[575,1294,921],{"class":581},[575,1296,613],{"class":584},[575,1298,1299],{"class":600},"author\n",[575,1301,1302,1304,1306],{"class":577,"line":996},[575,1303,931],{"class":581},[575,1305,613],{"class":584},[575,1307,1308],{"class":600},"write_work_brief\n",[575,1310,1311],{"class":577,"line":1006},[575,1312,752],{"emptyLinePlaceholder":751},[575,1314,1316],{"class":577,"line":1315},18,[575,1317,1318],{"class":1212},"  # ... the rest, unchanged\n",[526,1320,1321,1322,1324,1325,653],{},"A chain file cannot extend another chain, so the copy is a full copy. It does not\nfollow changes to the shipped ",[530,1323,532],{}," chain. See\n",[559,1326,172],{"href":173},[655,1328,1330],{"id":1329},"_4-check-it-and-load-it","4. Check it and load it",[565,1332,1334],{"className":1115,"code":1333,"language":1117,"meta":571,"style":571},"kraft admin templates lint\nkraft admin reload\nkraft admin templates show with-lint --resolved\n",[530,1335,1336,1349,1358],{"__ignoreMap":571},[575,1337,1338,1340,1343,1346],{"class":577,"line":578},[575,1339,1144],{"class":1152},[575,1341,1342],{"class":600}," admin",[575,1344,1345],{"class":600}," templates",[575,1347,1348],{"class":600}," lint\n",[575,1350,1351,1353,1355],{"class":577,"line":588},[575,1352,1144],{"class":1152},[575,1354,1342],{"class":600},[575,1356,1357],{"class":600}," reload\n",[575,1359,1360,1362,1364,1366,1369,1372],{"class":577,"line":607},[575,1361,1144],{"class":1152},[575,1363,1342],{"class":600},[575,1365,1345],{"class":600},[575,1367,1368],{"class":600}," show",[575,1370,1371],{"class":600}," with-lint",[575,1373,1374],{"class":888}," --resolved\n",[526,1376,1377],{},"A pass prints these two lines (the counts are your own):",[565,1379,1384],{"className":1380,"code":1382,"language":1383,"meta":571},[1381],"language-text","$ kraft admin templates lint\n3 chain(s), no errors\n$ kraft admin reload\nreloaded 3 template(s) and policy.yaml and intake.yaml\n","text",[530,1385,1386,1390,1394,1398],{"__ignoreMap":571},[575,1387,1389],{"className":1388},[577],"$ kraft admin templates lint\n",[575,1391,1393],{"className":1392},[577],"3 chain(s), no errors\n",[575,1395,1397],{"className":1396},[577],"$ kraft admin reload\n",[575,1399,1401],{"className":1400},[577],"reloaded 3 template(s) and policy.yaml and intake.yaml\n",[1403,1404,1405,1418,1428],"ol",{},[663,1406,1407,1409,1410,1413,1414,1417],{},[530,1408,536],{}," reads the files from disk. It prints ",[530,1411,1412],{},"N chain(s), no errors"," before you\nreload. On an error it prints one ",[530,1415,1416],{},"file:line:column: message"," line for each\nissue and exits 1.",[663,1419,1420,1423,1424,1427],{},[530,1421,1422],{},"reload"," makes the running server read the files again, with no restart. It\nprints ",[530,1425,1426],{},"invalid:"," lines and exits 1 for a file that does not load.",[663,1429,1430,1433,1434,1436,1437,1440,1441,1074,1444,1446,1447,1450,1451,653],{},[530,1431,1432],{},"show --resolved"," prints the chain with every library component expanded.\nLook for your ",[530,1435,536],{}," node with its ",[530,1438,1439],{},"fix_loop",", its ",[530,1442,1443],{},"policy",[530,1445,1024],{},". ",[530,1448,1449],{},"show"," asks the running server, so before the reload it\nanswers ",[530,1452,1453],{},"unknown chain",[655,1455,1457],{"id":1456},"_5-use-it","5. Use it",[526,1459,1460],{},"Name the chain when you file work:",[565,1462,1464],{"className":1115,"code":1463,"language":1117,"meta":571,"style":571},"kraft item create \"Add the export button\" --chain with-lint\n",[530,1465,1466],{"__ignoreMap":571},[575,1467,1468,1470,1473,1476,1479,1482],{"class":577,"line":578},[575,1469,1144],{"class":1152},[575,1471,1472],{"class":600}," item",[575,1474,1475],{"class":600}," create",[575,1477,1478],{"class":600}," \"Add the export button\"",[575,1480,1481],{"class":888}," --chain",[575,1483,1484],{"class":600}," with-lint\n",[526,1486,1487,1490],{},[530,1488,1489],{},"kraft item set-chain ID --chain with-lint"," switches an item that has not\nstarted yet.",[526,1492,1493,1494,1497,1498,1500,1501,1504,1505,1508,1509,1513,1514,1517,1518,1521,1522,1525],{},"To make it the repo's default instead, set ",[530,1495,1496],{},"default_chain: with-lint"," on the\nrepo's entry in ",[530,1499,300],{},". Every item filed on that repo without a chain then\ngets ",[530,1502,1503],{},"with-lint",", however it is filed: ",[530,1506,1507],{},"kraft item create",", the MCP tool, the\nboard's New ",[559,1510,1512],{"href":1511},"\u002Fconcepts\u002Fvocabulary#work-item","work item"," composer, ",[530,1515,1516],{},"POST \u002Fapi\u002Fwork-items",", ",[530,1519,1520],{},"POST \u002Fapi\u002Ftriggers",", and\n",[559,1523,1524],{"href":335},"auto-intake",". Naming a chain still wins.",[655,1527,1529],{"id":1528},"check-it-worked","Check it worked",[526,1531,1532],{},"Steps 3 and 4 already show the chain loads. These checks prove it on a real\nitem and cost a full run, so they are optional:",[1403,1534,1535,1544],{},[663,1536,1537,1540,1541,653],{},[530,1538,1539],{},"kraft item skip ID"," on the lint node answers\n",[530,1542,1543],{},"path: 'lint' does not allow skipping",[663,1545,1546,1547,1549,1550,1574,1577,1578,1517,1581,1517,1584,1587,1588,1591,1592,1595,1596,1598,1599,1601,1602,1604,1605,1517,1608,1611,1612,1615,1616,1619,1620,1622],{},"File a small item on the new chain. Once it passes ",[530,1548,540],{},", list the\nlint node's findings:",[565,1551,1553],{"className":1115,"code":1552,"language":1117,"meta":571,"style":571},"kraft view events ID --type findings_measured\n",[530,1554,1555],{"__ignoreMap":571},[575,1556,1557,1559,1562,1565,1568,1571],{"class":577,"line":578},[575,1558,1144],{"class":1152},[575,1560,1561],{"class":600}," view",[575,1563,1564],{"class":600}," events",[575,1566,1567],{"class":600}," ID",[575,1569,1570],{"class":888}," --type",[575,1572,1573],{"class":600}," findings_measured\n",[1575,1576],"br",{},"The output is a table with the columns ",[530,1579,1580],{},"SEQ",[530,1582,1583],{},"WHEN",[530,1585,1586],{},"TYPE"," and ",[530,1589,1590],{},"DETAIL",". A\nfailing lint shows a ",[530,1593,1594],{},"findings_measured"," row for node ",[530,1597,536],{}," with one\n",[530,1600,820],{}," finding. A clean lint shows a ",[530,1603,1594],{}," row with no\nfindings. Without ",[530,1606,1607],{},"--type",[530,1609,1610],{},"kraft view events ID"," also shows what followed:\na ",[530,1613,1614],{},"fix_cycle_started"," row after a failing lint, or ",[530,1617,1618],{},"node_completed"," for ",[530,1621,536],{},"\nafter a clean one.",[655,1624,1626],{"id":1625},"next-steps","Next steps",[660,1628,1629,1634,1639,1644,1658],{},[663,1630,1631,1633],{},[559,1632,392],{"href":393},": every key a node, step and task takes.",[663,1635,1636,1638],{},[559,1637,322],{"href":323},": the library sections and how a chain extends them.",[663,1640,1641,1643],{},[559,1642,106],{"href":107},": put the shipped review skills in a chain of your own.",[663,1645,1646,1648,1649,1653,1654,1657],{},[559,1647,114],{"href":115},": publish chains of your own as a ",[559,1650,1652],{"href":1651},"\u002Fconcepts\u002Fvocabulary#add-on","Kraft add-on"," that other instances install. An add-on cannot carry this guide's ",[530,1655,1656],{},"subprocess"," lint task or extend your local library.",[663,1659,1660,1662],{},[559,1661,172],{"href":173},": take what a new release ships without losing this chain.",[1664,1665,1666],"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 .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .ssYy9, html code.shiki .ssYy9{--shiki-light:#023B95;--shiki-default:#023B95;--shiki-dark:#91CBFF}html pre.shiki code .sklAV, html code.shiki .sklAV{--shiki-light:#A0111F;--shiki-default:#A0111F;--shiki-dark:#FF9492}html pre.shiki code .szw1H, html code.shiki .szw1H{--shiki-light:#702C00;--shiki-default:#702C00;--shiki-dark:#FFB757}html pre.shiki code .sq92B, html code.shiki .sq92B{--shiki-light:#66707B;--shiki-default:#66707B;--shiki-dark:#BDC4CC}",{"title":571,"searchDepth":588,"depth":588,"links":1668},[1669,1670,1671,1672,1673,1674,1675,1676],{"id":657,"depth":588,"text":658},{"id":697,"depth":588,"text":698},{"id":838,"depth":588,"text":839},{"id":1100,"depth":588,"text":1101},{"id":1329,"depth":588,"text":1330},{"id":1456,"depth":588,"text":1457},{"id":1528,"depth":588,"text":1529},{"id":1625,"depth":588,"text":1626},"Add a lint node to a copy of the default chain, with an agent that fixes what lint reports, a time cap, and no way to skip it.","md",null,{},{"title":102},{"title":102,"description":1677},"fJ4vOWZUuJRFcsr-3uzliLFmk9iaAl3MxdX3v0ohflk",[1685,1687],{"title":92,"path":93,"stem":94,"description":1686,"children":-1},"Set up a webhook or alerts in your browser, so Kraft tells you when a work item waits at a gate or stops, and check that a test reaches you.",{"title":106,"path":107,"stem":108,"description":1688,"children":-1},"Add the shipped security-review and gate-review skills to a chain of your own, since no shipped chain uses them.",1791801161060]