[{"data":1,"prerenderedAt":1659},["ShallowReactive",2],{"navigation_docs":3,"-guides-customize-write-your-own-chain":504,"-guides-customize-write-your-own-chain-surround":1654},[4,28,51,187,214,469],{"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,113,134,183],{"title":10,"path":53,"stem":57},"3.guides\u002Findex",{"title":59,"path":60,"stem":61,"children":62,"page":95},"Day to day","\u002Fguides\u002Fday-to-day","3.guides\u002F1.day-to-day",[63,67,71,75,79,83,87,91],{"title":64,"path":65,"stem":66},"The setup wizard on first start","\u002Fguides\u002Fday-to-day\u002Ffirst-run","3.guides\u002F1.day-to-day\u002F2.first-run",{"title":68,"path":69,"stem":70},"File a work item","\u002Fguides\u002Fday-to-day\u002Ffile-a-work-item","3.guides\u002F1.day-to-day\u002F3.file-a-work-item",{"title":72,"path":73,"stem":74},"Use Kraft from your agent","\u002Fguides\u002Fday-to-day\u002Fagent-integration","3.guides\u002F1.day-to-day\u002F4.agent-integration",{"title":76,"path":77,"stem":78},"Reviewing a change","\u002Fguides\u002Fday-to-day\u002Freview-a-change","3.guides\u002F1.day-to-day\u002F5.review-a-change",{"title":80,"path":81,"stem":82},"Raise a cap on a stopped item","\u002Fguides\u002Fday-to-day\u002Fraise-a-cap","3.guides\u002F1.day-to-day\u002F6.raise-a-cap",{"title":84,"path":85,"stem":86},"Kraft for VS Code","\u002Fguides\u002Fday-to-day\u002Fvscode","3.guides\u002F1.day-to-day\u002F7.vscode",{"title":88,"path":89,"stem":90},"Kraft on a phone","\u002Fguides\u002Fday-to-day\u002Fkraft-on-a-phone","3.guides\u002F1.day-to-day\u002F8.kraft-on-a-phone",{"title":92,"path":93,"stem":94},"Get notified when an item needs you","\u002Fguides\u002Fday-to-day\u002Fnotifications","3.guides\u002F1.day-to-day\u002F9.notifications",false,{"title":97,"path":98,"stem":99,"children":100,"page":95},"Customize and automate","\u002Fguides\u002Fcustomize","3.guides\u002F2.customize",[101,105,109],{"title":102,"path":103,"stem":104},"Write your own chain","\u002Fguides\u002Fcustomize\u002Fwrite-your-own-chain","3.guides\u002F2.customize\u002F1.write-your-own-chain",{"title":106,"path":107,"stem":108},"Add a security review or a gate reviewer","\u002Fguides\u002Fcustomize\u002Fadd-review-agents","3.guides\u002F2.customize\u002F2.add-review-agents",{"title":110,"path":111,"stem":112},"Schedule or webhook work","\u002Fguides\u002Fcustomize\u002Fschedule-and-webhook-work","3.guides\u002F2.customize\u002F3.schedule-and-webhook-work",{"title":114,"path":115,"stem":116,"children":117,"page":95},"Agents and harnesses","\u002Fguides\u002Fharnesses","3.guides\u002F3.harnesses",[118,122,126,130],{"title":119,"path":120,"stem":121},"Switch a task to another harness","\u002Fguides\u002Fharnesses\u002Fswitch-harness","3.guides\u002F3.harnesses\u002F1.switch-harness",{"title":123,"path":124,"stem":125},"Add or override a harness","\u002Fguides\u002Fharnesses\u002Fadding-a-harness","3.guides\u002F3.harnesses\u002F2.adding-a-harness",{"title":127,"path":128,"stem":129},"Build a worker Kit","\u002Fguides\u002Fharnesses\u002Fworker-kit","3.guides\u002F3.harnesses\u002F3.worker-kit",{"title":131,"path":132,"stem":133},"Give a worker its login","\u002Fguides\u002Fharnesses\u002Fgive-a-worker-its-login","3.guides\u002F3.harnesses\u002F4.give-a-worker-its-login",{"title":135,"path":136,"stem":137,"children":138,"page":95},"Run the server","\u002Fguides\u002Frun","3.guides\u002F4.run",[139,143,147,151,155,159,163,167,171,175,179],{"title":140,"path":141,"stem":142},"Remote access","\u002Fguides\u002Frun\u002Fremote-access","3.guides\u002F4.run\u002F01.remote-access",{"title":144,"path":145,"stem":146},"Put a proxy in front of Kraft","\u002Fguides\u002Frun\u002Fput-a-proxy-in-front-of-kraft","3.guides\u002F4.run\u002F02.put-a-proxy-in-front-of-kraft",{"title":148,"path":149,"stem":150},"Restart Kraft without ending running agents","\u002Fguides\u002Frun\u002Frestart-kraft","3.guides\u002F4.run\u002F03.restart-kraft",{"title":152,"path":153,"stem":154},"Back up and restore the database","\u002Fguides\u002Frun\u002Fback-up-and-restore","3.guides\u002F4.run\u002F04.back-up-and-restore",{"title":156,"path":157,"stem":158},"Logs and disk space","\u002Fguides\u002Frun\u002Flogs-and-disk-space","3.guides\u002F4.run\u002F05.logs-and-disk-space",{"title":160,"path":161,"stem":162},"Run Kraft as a service","\u002Fguides\u002Frun\u002Frun-as-a-service","3.guides\u002F4.run\u002F06.run-as-a-service",{"title":164,"path":165,"stem":166},"Upgrade Kraft","\u002Fguides\u002Frun\u002Fupgrade-kraft","3.guides\u002F4.run\u002F07.upgrade-kraft",{"title":168,"path":169,"stem":170},"Upgrade your configuration","\u002Fguides\u002Frun\u002Fupgrade-your-configuration","3.guides\u002F4.run\u002F08.upgrade-your-configuration",{"title":172,"path":173,"stem":174},"Upgrade from 1.4","\u002Fguides\u002Frun\u002Fupgrade-from-1-4","3.guides\u002F4.run\u002F09.upgrade-from-1-4",{"title":176,"path":177,"stem":178},"Upgrade from 0.x or a release candidate","\u002Fguides\u002Frun\u002Fupgrade-from-0-x-or-a-release-candidate","3.guides\u002F4.run\u002F10.upgrade-from-0-x-or-a-release-candidate",{"title":180,"path":181,"stem":182},"Roll back to 1.4","\u002Fguides\u002Frun\u002Froll-back","3.guides\u002F4.run\u002F11.roll-back",{"title":184,"path":185,"stem":186},"Kraft Lite","\u002Fguides\u002Fkraft-lite","3.guides\u002F5.kraft-lite",{"title":188,"path":189,"stem":190,"children":191,"page":-1},"Troubleshooting","\u002Ftroubleshooting","4.troubleshooting",[192,194,198,202,206,210],{"title":10,"path":189,"stem":193},"4.troubleshooting\u002Findex",{"title":195,"path":196,"stem":197},"Why did my item stop?","\u002Ftroubleshooting\u002Fwhy-did-my-item-stop","4.troubleshooting\u002F1.why-did-my-item-stop",{"title":199,"path":200,"stem":201},"Stop reasons in detail","\u002Ftroubleshooting\u002Fstop-reasons-in-detail","4.troubleshooting\u002F2.stop-reasons-in-detail",{"title":203,"path":204,"stem":205},"Starting and reaching Kraft","\u002Ftroubleshooting\u002Fstarting-and-reaching-kraft","4.troubleshooting\u002F3.starting-and-reaching-kraft",{"title":207,"path":208,"stem":209},"Doctor failures","\u002Ftroubleshooting\u002Fdoctor-failures","4.troubleshooting\u002F4.doctor-failures",{"title":211,"path":212,"stem":213},"Sandbox and Kit stops","\u002Ftroubleshooting\u002Fsandbox-and-kit-stops","4.troubleshooting\u002F5.sandbox-and-kit-stops",{"title":215,"path":216,"stem":217,"children":218,"page":-1},"Reference","\u002Freference","5.reference",[219,221,259,281,285,375,393,419,423,427,461,465],{"title":10,"path":216,"stem":220},"5.reference\u002Findex",{"title":222,"path":223,"stem":224,"children":225,"page":-1},"Web UI","\u002Freference\u002Fweb-ui","5.reference\u002F00.web-ui\u002Findex",[226,227,231,235,239,243,247,251,255],{"title":10,"path":223,"stem":224},{"title":228,"path":229,"stem":230},"Sidebar, search, and keyboard","\u002Freference\u002Fweb-ui\u002Fsidebar-search-and-keyboard","5.reference\u002F00.web-ui\u002F0.sidebar-search-and-keyboard",{"title":232,"path":233,"stem":234},"The board","\u002Freference\u002Fweb-ui\u002Fboard","5.reference\u002F00.web-ui\u002F1.board",{"title":236,"path":237,"stem":238},"An item's page","\u002Freference\u002Fweb-ui\u002Fitem-page","5.reference\u002F00.web-ui\u002F2.item-page",{"title":240,"path":241,"stem":242},"Fix loops and test scopes","\u002Freference\u002Fweb-ui\u002Ffix-loops-and-test-scopes","5.reference\u002F00.web-ui\u002F3.fix-loops-and-test-scopes",{"title":244,"path":245,"stem":246},"Config before an item starts","\u002Freference\u002Fweb-ui\u002Fconfig-before-start","5.reference\u002F00.web-ui\u002F4.config-before-start",{"title":248,"path":249,"stem":250},"The review page","\u002Freference\u002Fweb-ui\u002Freview-page","5.reference\u002F00.web-ui\u002F5.review-page",{"title":252,"path":253,"stem":254},"Templates and Settings","\u002Freference\u002Fweb-ui\u002Ftemplates-and-settings","5.reference\u002F00.web-ui\u002F6.templates-and-settings",{"title":256,"path":257,"stem":258},"Analytics","\u002Freference\u002Fweb-ui\u002Fanalytics","5.reference\u002F00.web-ui\u002F7.analytics",{"title":260,"path":261,"stem":262,"children":263,"page":-1},"CLI","\u002Freference\u002Fcli","5.reference\u002F01.cli\u002Findex",[264,265,269,273,277],{"title":10,"path":261,"stem":262},{"title":266,"path":267,"stem":268},"Item verbs","\u002Freference\u002Fcli\u002Fitem","5.reference\u002F01.cli\u002F2.item",{"title":270,"path":271,"stem":272},"View verbs","\u002Freference\u002Fcli\u002Fview","5.reference\u002F01.cli\u002F3.view",{"title":274,"path":275,"stem":276},"Repo verbs","\u002Freference\u002Fcli\u002Frepo","5.reference\u002F01.cli\u002F4.repo",{"title":278,"path":279,"stem":280},"Admin verbs","\u002Freference\u002Fcli\u002Fadmin","5.reference\u002F01.cli\u002F5.admin",{"title":282,"path":283,"stem":284},"Work item statuses","\u002Freference\u002Fstatuses","5.reference\u002F02.statuses",{"title":286,"path":287,"stem":288,"children":289,"page":-1},"Configuration","\u002Freference\u002Fconfiguration","5.reference\u002F03.configuration\u002Findex",[290,291,309,313,317,321,325,329,333,337,371],{"title":10,"path":287,"stem":288},{"title":292,"path":293,"stem":294,"children":295,"page":-1},"repos.yaml","\u002Freference\u002Fconfiguration\u002Frepos","5.reference\u002F03.configuration\u002F02.repos\u002Findex",[296,297,301,305],{"title":10,"path":293,"stem":294},{"title":298,"path":299,"stem":300},"How connect proposes commands","\u002Freference\u002Fconfiguration\u002Frepos\u002Fconnect-proposals","5.reference\u002F03.configuration\u002F02.repos\u002F1.connect-proposals",{"title":302,"path":303,"stem":304},"detectors.yaml","\u002Freference\u002Fconfiguration\u002Frepos\u002Fdetectors","5.reference\u002F03.configuration\u002F02.repos\u002F2.detectors",{"title":306,"path":307,"stem":308},"Workspaces","\u002Freference\u002Fconfiguration\u002Frepos\u002Fworkspaces","5.reference\u002F03.configuration\u002F02.repos\u002F3.workspaces",{"title":310,"path":311,"stem":312},"policy.yaml","\u002Freference\u002Fconfiguration\u002Fpolicy","5.reference\u002F03.configuration\u002F03.policy",{"title":314,"path":315,"stem":316},"Library and chains","\u002Freference\u002Fconfiguration\u002Flibrary-and-chains","5.reference\u002F03.configuration\u002F04.library-and-chains",{"title":318,"path":319,"stem":320},"harnesses.yaml","\u002Freference\u002Fconfiguration\u002Fharnesses-file","5.reference\u002F03.configuration\u002F05.harnesses-file",{"title":322,"path":323,"stem":324},"access.yaml","\u002Freference\u002Fconfiguration\u002Faccess","5.reference\u002F03.configuration\u002F06.access",{"title":326,"path":327,"stem":328},"intake.yaml","\u002Freference\u002Fconfiguration\u002Fintake","5.reference\u002F03.configuration\u002F07.intake",{"title":330,"path":331,"stem":332},"notify.yaml","\u002Freference\u002Fconfiguration\u002Fnotify","5.reference\u002F03.configuration\u002F08.notify",{"title":334,"path":335,"stem":336},"theme.yaml","\u002Freference\u002Fconfiguration\u002Ftheme","5.reference\u002F03.configuration\u002F09.theme",{"title":338,"path":339,"stem":340,"children":341,"page":-1},"Sandboxed workers","\u002Freference\u002Fconfiguration\u002Fsandbox","5.reference\u002F03.configuration\u002F10.sandbox\u002Findex",[342,343,347,351,355,359,363,367],{"title":10,"path":339,"stem":340},{"title":344,"path":345,"stem":346},"Resource limits","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fresource-limits","5.reference\u002F03.configuration\u002F10.sandbox\u002F1.resource-limits",{"title":348,"path":349,"stem":350},"Callbacks from a sandbox","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fcallbacks","5.reference\u002F03.configuration\u002F10.sandbox\u002F2.callbacks",{"title":352,"path":353,"stem":354},"Network policy","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fnetwork-policy","5.reference\u002F03.configuration\u002F10.sandbox\u002F3.network-policy",{"title":356,"path":357,"stem":358},"Credentials","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fcredentials","5.reference\u002F03.configuration\u002F10.sandbox\u002F4.credentials",{"title":360,"path":361,"stem":362},"Kits","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fkits","5.reference\u002F03.configuration\u002F10.sandbox\u002F5.kits",{"title":364,"path":365,"stem":366},"sandbox.yaml","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fsandbox-yaml","5.reference\u002F03.configuration\u002F10.sandbox\u002F6.sandbox-yaml",{"title":368,"path":369,"stem":370},"Git in a sandbox","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fgit-in-a-sandbox","5.reference\u002F03.configuration\u002F10.sandbox\u002F7.git-in-a-sandbox",{"title":372,"path":373,"stem":374},"Environment variables","\u002Freference\u002Fconfiguration\u002Fenvironment-variables","5.reference\u002F03.configuration\u002F11.environment-variables",{"title":376,"path":377,"stem":378,"children":379,"page":-1},"Chain file keys","\u002Freference\u002Fchain-nodes","5.reference\u002F04.chain-nodes\u002Findex",[380,381,385,389],{"title":10,"path":377,"stem":378},{"title":382,"path":383,"stem":384},"Subprocess tasks","\u002Freference\u002Fchain-nodes\u002Fsubprocess-tasks","5.reference\u002F04.chain-nodes\u002F2.subprocess-tasks",{"title":386,"path":387,"stem":388},"Fix loop and judge","\u002Freference\u002Fchain-nodes\u002Ffix-loop","5.reference\u002F04.chain-nodes\u002F3.fix-loop",{"title":390,"path":391,"stem":392},"Result file","\u002Freference\u002Fchain-nodes\u002Fresult-file","5.reference\u002F04.chain-nodes\u002F4.result-file",{"title":394,"path":395,"stem":396,"children":397,"page":-1},"Agent harnesses","\u002Freference\u002Fharnesses","5.reference\u002F05.harnesses\u002Findex",[398,399,403,407,411,415],{"title":10,"path":395,"stem":396},{"title":400,"path":401,"stem":402},"Unattended runs","\u002Freference\u002Fharnesses\u002Funattended-runs","5.reference\u002F05.harnesses\u002F2.unattended-runs",{"title":404,"path":405,"stem":406},"Agent profiles","\u002Freference\u002Fharnesses\u002Fagent-profiles","5.reference\u002F05.harnesses\u002F3.agent-profiles",{"title":408,"path":409,"stem":410},"Harness definition files","\u002Freference\u002Fharnesses\u002Fharness-files","5.reference\u002F05.harnesses\u002F4.harness-files",{"title":412,"path":413,"stem":414},"Fallback and escalation","\u002Freference\u002Fharnesses\u002Ffallback-and-escalation","5.reference\u002F05.harnesses\u002F5.fallback-and-escalation",{"title":416,"path":417,"stem":418},"Cost reporting","\u002Freference\u002Fharnesses\u002Fcost-reporting","5.reference\u002F05.harnesses\u002F6.cost-reporting",{"title":420,"path":421,"stem":422},"Permission gate","\u002Freference\u002Fpermissions","5.reference\u002F06.permissions",{"title":424,"path":425,"stem":426},"Inbound triggers","\u002Freference\u002Ftriggers","5.reference\u002F07.triggers",{"title":428,"path":429,"stem":430,"children":431,"page":-1},"HTTP API","\u002Freference\u002Fhttp-api","5.reference\u002F08.http-api\u002Findex",[432,433,437,441,445,449,453,457],{"title":10,"path":429,"stem":430},{"title":434,"path":435,"stem":436},"Filing, reading and changing work items","\u002Freference\u002Fhttp-api\u002Fwork-items","5.reference\u002F08.http-api\u002F2.work-items",{"title":438,"path":439,"stem":440},"Gates, run control, ending and retry","\u002Freference\u002Fhttp-api\u002Fgates-run-control-and-ending","5.reference\u002F08.http-api\u002F3.gates-run-control-and-ending",{"title":442,"path":443,"stem":444},"The work item object","\u002Freference\u002Fhttp-api\u002Fwork-item-object","5.reference\u002F08.http-api\u002F4.work-item-object",{"title":446,"path":447,"stem":448},"Budget, events, diff and documents","\u002Freference\u002Fhttp-api\u002Fbudget-and-events","5.reference\u002F08.http-api\u002F5.budget-and-events",{"title":450,"path":451,"stem":452},"Repos, chains, harnesses and the server","\u002Freference\u002Fhttp-api\u002Frepos-chains-harnesses-and-server","5.reference\u002F08.http-api\u002F6.repos-chains-harnesses-and-server",{"title":454,"path":455,"stem":456},"Drafts","\u002Freference\u002Fhttp-api\u002Fdrafts","5.reference\u002F08.http-api\u002F7.drafts",{"title":458,"path":459,"stem":460},"Ops for each draft area","\u002Freference\u002Fhttp-api\u002Fdraft-ops","5.reference\u002F08.http-api\u002F8.draft-ops",{"title":462,"path":463,"stem":464},"MCP tools","\u002Freference\u002Fmcp-tools","5.reference\u002F09.mcp-tools",{"title":466,"path":467,"stem":468},"Events","\u002Freference\u002Fevents","5.reference\u002F10.events",{"title":470,"path":471,"stem":472,"children":473,"page":-1},"Security and project","\u002Fproject","6.project",[474,476,480,484,488,492,496,500],{"title":10,"path":471,"stem":475},"6.project\u002Findex",{"title":477,"path":478,"stem":479},"Security","\u002Fproject\u002Fsecurity","6.project\u002F1.security",{"title":481,"path":482,"stem":483},"Data and privacy","\u002Fproject\u002Fdata-and-privacy","6.project\u002F2.data-and-privacy",{"title":485,"path":486,"stem":487},"What's new in 2.0","\u002Fproject\u002Fwhats-new","6.project\u002F3.whats-new",{"title":489,"path":490,"stem":491},"Status and support","\u002Fproject\u002Fstatus-and-support","6.project\u002F4.status-and-support",{"title":493,"path":494,"stem":495},"Architecture","\u002Fproject\u002Farchitecture","6.project\u002F5.architecture",{"title":497,"path":498,"stem":499},"Source map","\u002Fproject\u002Fsource-map","6.project\u002F6.source-map",{"title":501,"path":502,"stem":503},"Contributing","\u002Fproject\u002Fcontributing","6.project\u002F7.contributing",{"id":505,"title":102,"body":506,"description":1647,"extension":1648,"links":1649,"meta":1650,"navigation":1651,"path":103,"seo":1652,"stem":104,"__hash__":1653},"docs\u002F3.guides\u002F2.customize\u002F1.write-your-own-chain.md",{"type":507,"value":508,"toc":1637},"minimark",[509,526,638,643,679,683,693,788,806,820,824,836,999,1002,1082,1086,1097,1147,1167,1303,1311,1315,1359,1362,1386,1438,1442,1445,1469,1475,1510,1514,1517,1607,1611,1633],[510,511,512,513,517,518,521,522,525],"p",{},"You will have a chain of your own: a copy of the shipped ",[514,515,516],"code",{},"default"," chain with a\n",[514,519,520],{},"lint"," node after ",[514,523,524],{},"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.",[527,528,529,548,625],"note",{},[510,530,531,532,535,536,538,539,541,542,547],{},"If you only need lint to run when certain files change, you do not need a node.\nAdd the linter to the repo's ",[514,533,534],{},"test_scopes"," in ",[514,537,292],{},". The shipped\n",[514,540,524],{}," node runs every scope whose paths the change touches, and its\n",[543,544,546],"a",{"href":545},"\u002Fconcepts\u002Fvocabulary#fix-loop","fix loop"," repairs the failures:",[549,550,556],"pre",{"className":551,"code":552,"filename":553,"language":554,"meta":555,"style":555},"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","",[514,557,558,570,589,601,615],{"__ignoreMap":555},[559,560,563,566],"span",{"class":561,"line":562},"line",1,[559,564,534],{"class":565},"sb7M8",[559,567,569],{"class":568},"s7iLA",":\n",[559,571,573,576,579,582,586],{"class":561,"line":572},2,[559,574,575],{"class":568},"  - ",[559,577,578],{"class":565},"paths",[559,580,581],{"class":568},": [",[559,583,585],{"class":584},"semJd","\"src\u002F**\"",[559,587,588],{"class":568},"]\n",[559,590,592,595,598],{"class":561,"line":591},3,[559,593,594],{"class":565},"    command",[559,596,597],{"class":568},": ",[559,599,600],{"class":584},"npm test\n",[559,602,604,606,608,610,613],{"class":561,"line":603},4,[559,605,575],{"class":568},[559,607,578],{"class":565},[559,609,581],{"class":568},[559,611,612],{"class":584},"\"src\u002F**\u002F*.ts\"",[559,614,588],{"class":568},[559,616,618,620,622],{"class":561,"line":617},5,[559,619,594],{"class":565},[559,621,597],{"class":568},[559,623,624],{"class":584},"sh -c 'npm run lint && npx tsc --noEmit'\n",[510,626,627,628,631,632,637],{},"A scope's ",[514,629,630],{},"command"," runs with no shell too. See\n",[543,633,635],{"href":634},"\u002Freference\u002Fconfiguration\u002Frepos#test_scopes",[514,636,534],{},".",[639,640,642],"h2",{"id":641},"before-you-start","Before you start",[644,645,646,650,657],"ul",{},[647,648,649],"li",{},"A running Kraft server and a connected repo.",[647,651,652,653,656],{},"A lint command that exits 0 when the code is clean. This guide uses\n",[514,654,655],{},"npm run lint && npx tsc --noEmit",". Use your own.",[647,658,659,660,663,664,667,668,671,672,675,676,637],{},"Your config directory: ",[514,661,662],{},"~\u002F.kraft\u002Fconfig\u002F",", or ",[514,665,666],{},"$KRAFT_HOME\u002Fconfig\u002F"," if you set\n",[514,669,670],{},"KRAFT_HOME",". You edit ",[514,673,674],{},"library.yaml"," in it and add a file under ",[514,677,678],{},"chains\u002F",[639,680,682],{"id":681},"_1-add-the-tasks-to-the-library","1. Add the tasks to the library",[510,684,685,686,688,689,692],{},"Add two tasks to ",[514,687,674],{},", under ",[514,690,691],{},"tasks:",". One runs the linter. The other\nis the agent that repairs what the linter reports.",[549,694,697],{"className":551,"code":695,"filename":696,"language":554,"meta":555,"style":555},"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",[514,698,699,706,713,723,731,737,745,755,766,777],{"__ignoreMap":555},[559,700,701,704],{"class":561,"line":562},[559,702,703],{"class":565},"tasks",[559,705,569],{"class":568},[559,707,708,711],{"class":561,"line":572},[559,709,710],{"class":565},"  lint",[559,712,569],{"class":568},[559,714,715,718,720],{"class":561,"line":591},[559,716,717],{"class":565},"    kind",[559,719,597],{"class":568},[559,721,722],{"class":584},"subprocess\n",[559,724,725,727,729],{"class":561,"line":603},[559,726,594],{"class":565},[559,728,597],{"class":568},[559,730,624],{"class":584},[559,732,733],{"class":561,"line":617},[559,734,736],{"emptyLinePlaceholder":735},true,"\n",[559,738,740,743],{"class":561,"line":739},6,[559,741,742],{"class":565},"  repair_lint",[559,744,569],{"class":568},[559,746,748,750,752],{"class":561,"line":747},7,[559,749,717],{"class":565},[559,751,597],{"class":568},[559,753,754],{"class":584},"agent\n",[559,756,758,761,763],{"class":561,"line":757},8,[559,759,760],{"class":565},"    harness",[559,762,597],{"class":568},[559,764,765],{"class":584},"claude\n",[559,767,769,772,774],{"class":561,"line":768},9,[559,770,771],{"class":565},"    profile",[559,773,597],{"class":568},[559,775,776],{"class":584},"strong\n",[559,778,780,783,785],{"class":561,"line":779},10,[559,781,782],{"class":565},"    prompt",[559,784,597],{"class":568},[559,786,787],{"class":584},"Fix the lint and type errors the lint step reported. Change no behavior.\n",[510,789,790,791,793,794,797,798,801,802,805],{},"Kraft does not run ",[514,792,630],{}," through a shell, so ",[514,795,796],{},"&&"," and pipes need the\n",[514,799,800],{},"sh -c '...'"," wrapper. A failing lint becomes a ",[514,803,804],{},"critical"," finding that holds the\nend of the command's output, and the repair agent reads it.",[510,807,808,809,812,813,815,816,819],{},"Inside a fix loop, Kraft replaces the repair task's ",[514,810,811],{},"prompt"," with its own\ninstruction. See ",[543,814,382],{"href":383}," for\nhow the command runs and how its exit code becomes a status, and\n",[543,817,386],{"href":818},"\u002Freference\u002Fchain-nodes\u002Ffix-loop#what-a-repair-task-is-told","\nfor what the repair agent is told.",[639,821,823],{"id":822},"_2-add-the-node-to-the-library","2. Add the node to the library",[510,825,826,827,829,830,688,832,835],{},"Add a ",[514,828,520],{}," node to ",[514,831,674],{},[514,833,834],{},"nodes:",":",[549,837,839],{"className":551,"code":838,"filename":696,"language":554,"meta":555,"style":555},"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",[514,840,841,848,854,863,874,881,891,898,911,920,927,935,948,959,967,978,988],{"__ignoreMap":555},[559,842,843,846],{"class":561,"line":562},[559,844,845],{"class":565},"nodes",[559,847,569],{"class":568},[559,849,850,852],{"class":561,"line":572},[559,851,710],{"class":565},[559,853,569],{"class":568},[559,855,856,858,860],{"class":561,"line":591},[559,857,717],{"class":565},[559,859,597],{"class":568},[559,861,862],{"class":584},"exec\n",[559,864,865,868,870],{"class":561,"line":603},[559,866,867],{"class":565},"    skippable",[559,869,597],{"class":568},[559,871,873],{"class":872},"ssYy9","false\n",[559,875,876,879],{"class":561,"line":617},[559,877,878],{"class":565},"    policy",[559,880,569],{"class":568},[559,882,883,886,888],{"class":561,"line":739},[559,884,885],{"class":565},"      time_cap_minutes",[559,887,597],{"class":568},[559,889,890],{"class":872},"30\n",[559,892,893,896],{"class":561,"line":747},[559,894,895],{"class":565},"    tasks",[559,897,569],{"class":568},[559,899,900,903,906,908],{"class":561,"line":757},[559,901,902],{"class":568},"      - ",[559,904,905],{"class":565},"id",[559,907,597],{"class":568},[559,909,910],{"class":584},"lint\n",[559,912,913,916,918],{"class":561,"line":768},[559,914,915],{"class":565},"        extends",[559,917,597],{"class":568},[559,919,910],{"class":584},[559,921,922,925],{"class":561,"line":779},[559,923,924],{"class":565},"    fix_loop",[559,926,569],{"class":568},[559,928,930,933],{"class":561,"line":929},11,[559,931,932],{"class":565},"      tasks",[559,934,569],{"class":568},[559,936,938,941,943,945],{"class":561,"line":937},12,[559,939,940],{"class":568},"        - ",[559,942,905],{"class":565},[559,944,597],{"class":568},[559,946,947],{"class":584},"repair\n",[559,949,951,954,956],{"class":561,"line":950},13,[559,952,953],{"class":565},"          extends",[559,955,597],{"class":568},[559,957,958],{"class":584},"repair_lint\n",[559,960,962,965],{"class":561,"line":961},14,[559,963,964],{"class":565},"      judge",[559,966,569],{"class":568},[559,968,970,973,975],{"class":561,"line":969},15,[559,971,972],{"class":565},"        id",[559,974,597],{"class":568},[559,976,977],{"class":584},"judge\n",[559,979,981,983,985],{"class":561,"line":980},16,[559,982,915],{"class":565},[559,984,597],{"class":568},[559,986,987],{"class":584},"strict_judge\n",[559,989,991,994,996],{"class":561,"line":990},17,[559,992,993],{"class":565},"      max_attempts",[559,995,597],{"class":568},[559,997,998],{"class":872},"3\n",[510,1000,1001],{},"What each key does:",[644,1003,1004,1017,1027,1061],{},[647,1005,1006,1009,1010,1013,1014,637],{},[514,1007,1008],{},"skippable: false",": refuses ",[514,1011,1012],{},"kraft item skip"," on this node, a chain revision\nthat proposes skipping it, and ",[514,1015,1016],{},"kraft item create --skip-nodes lint",[647,1018,1019,1022,1023,637],{},[514,1020,1021],{},"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",[543,1024,1026],{"href":1025},"\u002Fconcepts\u002Fcaps-and-budgets#time-caps","Time caps",[647,1028,1029,1032,1033,1036,1037,1041,1042,1046,1047,1049,1050,663,1052,1055,1056,1058,1059,637],{},[514,1030,1031],{},"fix_loop.tasks",": runs after a failing lint, then the lint runs again. The loop\nrepeats until lint passes or ",[514,1034,1035],{},"max_attempts"," runs out. Then the node is ",[543,1038,1040],{"href":1039},"\u002Fconcepts\u002Fvocabulary#stuck","stuck",": an\n",[543,1043,1045],{"href":1044},"\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 ",[514,1048,310],{},"\n(",[514,1051,516],{},[514,1053,1054],{},"loops.lint.fix_loop","). See\n",[543,1057,386],{"href":387}," and\n",[543,1060,310],{"href":311},[647,1062,1063,1066,1067,1070,1071,1074,1075,1077,1078,637],{},[514,1064,1065],{},"judge",": optional. ",[514,1068,1069],{},"strict_judge"," is the ",[543,1072,1065],{"href":1073},"\u002Fconcepts\u002Fvocabulary#judge"," task the shipped library\nprovides, the one ",[514,1076,524],{}," uses. See\n",[543,1079,1081],{"href":1080},"\u002Freference\u002Fchain-nodes\u002Ffix-loop#the-judge","The judge",[639,1083,1085],{"id":1084},"_3-make-the-chain","3. Make the chain",[510,1087,1088,1089,1092,1093,1096],{},"Copy the default chain and give the copy its own id. ",[514,1090,1091],{},"cp -n"," never overwrites a file, so run it once: if ",[514,1094,1095],{},"chains\u002Fwith-lint.yaml"," exists, skip the copy and keep editing it.",[549,1098,1102],{"className":1099,"code":1100,"language":1101,"meta":555,"style":555},"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",[514,1103,1104,1132],{"__ignoreMap":555},[559,1105,1106,1109,1112,1114,1118,1121,1124,1126,1129],{"class":561,"line":562},[559,1107,1108],{"class":872},"cd",[559,1110,1111],{"class":584}," \"${",[559,1113,670],{"class":568},[559,1115,1117],{"class":1116},"sklAV",":-",[559,1119,1120],{"class":568},"$HOME",[559,1122,1123],{"class":1116},"\u002F",[559,1125,637],{"class":584},[559,1127,1128],{"class":568},"kraft",[559,1130,1131],{"class":584},"}\u002Fconfig\"\n",[559,1133,1134,1138,1141,1144],{"class":561,"line":572},[559,1135,1137],{"class":1136},"szw1H","cp",[559,1139,1140],{"class":872}," -n",[559,1142,1143],{"class":584}," chains\u002Fdefault.yaml",[559,1145,1146],{"class":584}," chains\u002Fwith-lint.yaml\n",[510,1148,1149,1150,1152,1153,1156,1157,1160,1161,1163,1164,1166],{},"In ",[514,1151,1095],{},", change ",[514,1154,1155],{},"id: default"," to ",[514,1158,1159],{},"id: with-lint",". Then add the\n",[514,1162,520],{}," node right after ",[514,1165,524],{},". The finished file, with the unchanged\nnodes left out:",[549,1168,1171],{"className":551,"code":1169,"filename":1170,"language":554,"meta":555,"style":555},"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",[514,1172,1173,1182,1186,1192,1198,1202,1213,1222,1226,1236,1244,1248,1259,1267,1273,1284,1293,1297],{"__ignoreMap":555},[559,1174,1175,1177,1179],{"class":561,"line":562},[559,1176,905],{"class":565},[559,1178,597],{"class":568},[559,1180,1181],{"class":584},"with-lint\n",[559,1183,1184],{"class":561,"line":572},[559,1185,736],{"emptyLinePlaceholder":735},[559,1187,1188,1190],{"class":561,"line":591},[559,1189,845],{"class":565},[559,1191,569],{"class":568},[559,1193,1194],{"class":561,"line":603},[559,1195,1197],{"class":1196},"sq92B","  # ... spec through implementation, unchanged\n",[559,1199,1200],{"class":561,"line":617},[559,1201,736],{"emptyLinePlaceholder":735},[559,1203,1204,1206,1208,1210],{"class":561,"line":739},[559,1205,575],{"class":568},[559,1207,905],{"class":565},[559,1209,597],{"class":568},[559,1211,1212],{"class":584},"verification\n",[559,1214,1215,1218,1220],{"class":561,"line":747},[559,1216,1217],{"class":565},"    extends",[559,1219,597],{"class":568},[559,1221,1212],{"class":584},[559,1223,1224],{"class":561,"line":757},[559,1225,736],{"emptyLinePlaceholder":735},[559,1227,1228,1230,1232,1234],{"class":561,"line":768},[559,1229,575],{"class":568},[559,1231,905],{"class":565},[559,1233,597],{"class":568},[559,1235,910],{"class":584},[559,1237,1238,1240,1242],{"class":561,"line":779},[559,1239,1217],{"class":565},[559,1241,597],{"class":568},[559,1243,910],{"class":584},[559,1245,1246],{"class":561,"line":929},[559,1247,736],{"emptyLinePlaceholder":735},[559,1249,1250,1252,1254,1256],{"class":561,"line":937},[559,1251,575],{"class":568},[559,1253,905],{"class":565},[559,1255,597],{"class":568},[559,1257,1258],{"class":584},"work_brief\n",[559,1260,1261,1263,1265],{"class":561,"line":950},[559,1262,717],{"class":565},[559,1264,597],{"class":568},[559,1266,862],{"class":584},[559,1268,1269,1271],{"class":561,"line":961},[559,1270,895],{"class":565},[559,1272,569],{"class":568},[559,1274,1275,1277,1279,1281],{"class":561,"line":969},[559,1276,902],{"class":568},[559,1278,905],{"class":565},[559,1280,597],{"class":568},[559,1282,1283],{"class":584},"author\n",[559,1285,1286,1288,1290],{"class":561,"line":980},[559,1287,915],{"class":565},[559,1289,597],{"class":568},[559,1291,1292],{"class":584},"write_work_brief\n",[559,1294,1295],{"class":561,"line":990},[559,1296,736],{"emptyLinePlaceholder":735},[559,1298,1300],{"class":561,"line":1299},18,[559,1301,1302],{"class":1196},"  # ... the rest, unchanged\n",[510,1304,1305,1306,1308,1309,637],{},"A chain file cannot extend another chain, so the copy is a full copy. It does not\nfollow changes to the shipped ",[514,1307,516],{}," chain. See\n",[543,1310,168],{"href":169},[639,1312,1314],{"id":1313},"_4-check-it-and-load-it","4. Check it and load it",[549,1316,1318],{"className":1099,"code":1317,"language":1101,"meta":555,"style":555},"kraft admin templates lint\nkraft admin reload\nkraft admin templates show with-lint --resolved\n",[514,1319,1320,1333,1342],{"__ignoreMap":555},[559,1321,1322,1324,1327,1330],{"class":561,"line":562},[559,1323,1128],{"class":1136},[559,1325,1326],{"class":584}," admin",[559,1328,1329],{"class":584}," templates",[559,1331,1332],{"class":584}," lint\n",[559,1334,1335,1337,1339],{"class":561,"line":572},[559,1336,1128],{"class":1136},[559,1338,1326],{"class":584},[559,1340,1341],{"class":584}," reload\n",[559,1343,1344,1346,1348,1350,1353,1356],{"class":561,"line":591},[559,1345,1128],{"class":1136},[559,1347,1326],{"class":584},[559,1349,1329],{"class":584},[559,1351,1352],{"class":584}," show",[559,1354,1355],{"class":584}," with-lint",[559,1357,1358],{"class":872}," --resolved\n",[510,1360,1361],{},"A pass prints these two lines (the counts are your own):",[549,1363,1368],{"className":1364,"code":1366,"language":1367,"meta":555},[1365],"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",[514,1369,1370,1374,1378,1382],{"__ignoreMap":555},[559,1371,1373],{"className":1372},[561],"$ kraft admin templates lint\n",[559,1375,1377],{"className":1376},[561],"3 chain(s), no errors\n",[559,1379,1381],{"className":1380},[561],"$ kraft admin reload\n",[559,1383,1385],{"className":1384},[561],"reloaded 3 template(s) and policy.yaml and intake.yaml\n",[1387,1388,1389,1402,1412],"ol",{},[647,1390,1391,1393,1394,1397,1398,1401],{},[514,1392,520],{}," reads the files from disk. It prints ",[514,1395,1396],{},"N chain(s), no errors"," before you\nreload. On an error it prints one ",[514,1399,1400],{},"file:line:column: message"," line for each\nissue and exits 1.",[647,1403,1404,1407,1408,1411],{},[514,1405,1406],{},"reload"," makes the running server read the files again, with no restart. It\nprints ",[514,1409,1410],{},"invalid:"," lines and exits 1 for a file that does not load.",[647,1413,1414,1417,1418,1420,1421,1424,1425,1058,1428,1430,1431,1434,1435,637],{},[514,1415,1416],{},"show --resolved"," prints the chain with every library component expanded.\nLook for your ",[514,1419,520],{}," node with its ",[514,1422,1423],{},"fix_loop",", its ",[514,1426,1427],{},"policy",[514,1429,1008],{},". ",[514,1432,1433],{},"show"," asks the running server, so before the reload it\nanswers ",[514,1436,1437],{},"unknown chain",[639,1439,1441],{"id":1440},"_5-use-it","5. Use it",[510,1443,1444],{},"Name the chain when you file work:",[549,1446,1448],{"className":1099,"code":1447,"language":1101,"meta":555,"style":555},"kraft item create \"Add the export button\" --chain with-lint\n",[514,1449,1450],{"__ignoreMap":555},[559,1451,1452,1454,1457,1460,1463,1466],{"class":561,"line":562},[559,1453,1128],{"class":1136},[559,1455,1456],{"class":584}," item",[559,1458,1459],{"class":584}," create",[559,1461,1462],{"class":584}," \"Add the export button\"",[559,1464,1465],{"class":872}," --chain",[559,1467,1468],{"class":584}," with-lint\n",[510,1470,1471,1474],{},[514,1472,1473],{},"kraft item set-chain ID --chain with-lint"," switches an item that has not\nstarted yet.",[510,1476,1477,1478,1481,1482,1484,1485,1488,1489,1492,1493,1497,1498,1501,1502,1505,1506,1509],{},"To make it the repo's default instead, set ",[514,1479,1480],{},"default_chain: with-lint"," on the\nrepo's entry in ",[514,1483,292],{},". Every item filed on that repo without a chain then\ngets ",[514,1486,1487],{},"with-lint",", however it is filed: ",[514,1490,1491],{},"kraft item create",", the MCP tool, the\nboard's New ",[543,1494,1496],{"href":1495},"\u002Fconcepts\u002Fvocabulary#work-item","work item"," composer, ",[514,1499,1500],{},"POST \u002Fapi\u002Fwork-items",", ",[514,1503,1504],{},"POST \u002Fapi\u002Ftriggers",", and\n",[543,1507,1508],{"href":327},"auto-intake",". Naming a chain still wins.",[639,1511,1513],{"id":1512},"check-it-worked","Check it worked",[510,1515,1516],{},"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:",[1387,1518,1519,1528],{},[647,1520,1521,1524,1525,637],{},[514,1522,1523],{},"kraft item skip ID"," on the lint node answers\n",[514,1526,1527],{},"path: 'lint' does not allow skipping",[647,1529,1530,1531,1533,1534,1558,1561,1562,1501,1565,1501,1568,1571,1572,1575,1576,1579,1580,1582,1583,1585,1586,1588,1589,1501,1592,1595,1596,1599,1600,1603,1604,1606],{},"File a small item on the new chain. Once it passes ",[514,1532,524],{},", list the\nlint node's findings:",[549,1535,1537],{"className":1099,"code":1536,"language":1101,"meta":555,"style":555},"kraft view events ID --type findings_measured\n",[514,1538,1539],{"__ignoreMap":555},[559,1540,1541,1543,1546,1549,1552,1555],{"class":561,"line":562},[559,1542,1128],{"class":1136},[559,1544,1545],{"class":584}," view",[559,1547,1548],{"class":584}," events",[559,1550,1551],{"class":584}," ID",[559,1553,1554],{"class":872}," --type",[559,1556,1557],{"class":584}," findings_measured\n",[1559,1560],"br",{},"The output is a table with the columns ",[514,1563,1564],{},"SEQ",[514,1566,1567],{},"WHEN",[514,1569,1570],{},"TYPE"," and ",[514,1573,1574],{},"DETAIL",". A\nfailing lint shows a ",[514,1577,1578],{},"findings_measured"," row for node ",[514,1581,520],{}," with one\n",[514,1584,804],{}," finding. A clean lint shows a ",[514,1587,1578],{}," row with no\nfindings. Without ",[514,1590,1591],{},"--type",[514,1593,1594],{},"kraft view events ID"," also shows what followed:\na ",[514,1597,1598],{},"fix_cycle_started"," row after a failing lint, or ",[514,1601,1602],{},"node_completed"," for ",[514,1605,520],{},"\nafter a clean one.",[639,1608,1610],{"id":1609},"next-steps","Next steps",[644,1612,1613,1618,1623,1628],{},[647,1614,1615,1617],{},[543,1616,376],{"href":377},": every key a node, step and task takes.",[647,1619,1620,1622],{},[543,1621,314],{"href":315},": the library sections and how a chain extends them.",[647,1624,1625,1627],{},[543,1626,106],{"href":107},": put the shipped review skills in a chain of your own.",[647,1629,1630,1632],{},[543,1631,168],{"href":169},": take what a new release ships without losing this chain.",[1634,1635,1636],"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":555,"searchDepth":572,"depth":572,"links":1638},[1639,1640,1641,1642,1643,1644,1645,1646],{"id":641,"depth":572,"text":642},{"id":681,"depth":572,"text":682},{"id":822,"depth":572,"text":823},{"id":1084,"depth":572,"text":1085},{"id":1313,"depth":572,"text":1314},{"id":1440,"depth":572,"text":1441},{"id":1512,"depth":572,"text":1513},{"id":1609,"depth":572,"text":1610},"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":1647},"6Sm3EINQ-BtIwiWu53D-PD-7wNAvCxYmnFNmZB9jFpQ",[1655,1657],{"title":92,"path":93,"stem":94,"description":1656,"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":1658,"children":-1},"Add the shipped security-review and gate-review skills to a chain of your own, since no shipped chain uses them.",1791801239202]