[{"data":1,"prerenderedAt":1408},["ShallowReactive",2],{"navigation_docs":3,"-guides-customize-add-review-agents":520,"-guides-customize-add-review-agents-surround":1403},[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":106,"body":522,"description":1396,"extension":1397,"links":1398,"meta":1399,"navigation":1400,"path":107,"seo":1401,"stem":108,"__hash__":1402},"docs\u002F3.guides\u002F2.customize\u002F2.add-review-agents.md",{"type":523,"value":524,"toc":1387},"minimark",[525,538,564,567,572,598,602,943,947,1096,1120,1125,1150,1169,1173,1352,1356,1383],[526,527,528,529,533,534,537],"p",{},"Add the two review skills that no shipped chain runs to a copy of the ",[530,531,532],"code",{},"default","\nchain: a security review inside ",[530,535,536],{},"verification",", and an agent that reviews a gate\nbefore a person is asked.",[539,540,541,558],"ul",{},[542,543,544,547,548,551,552,557],"li",{},[530,545,546],{},"kraft:security-review"," reviews a change that touches authentication,\nsessions, tokens, secrets, or permission checks. It reports findings the way\n",[530,549,550],{},"kraft:code-review"," does, so they enter the same ",[553,554,556],"a",{"href":555},"\u002Fconcepts\u002Fvocabulary#fix-loop","fix loop",".",[542,559,560,563],{},[530,561,562],{},"kraft:gate-review"," reads the document a gate is about and reports a verdict,\nso a gate that needs no person's decision no longer waits for one. It never\nclears the gate itself.",[526,565,566],{},"Both are opt-in because both cost money. A security pass costs an extra agent\nsession per review round on every item. A gate reviewer is a paid agent session\non every item that reaches the gate with auto-gate on, and it decides whether a\nperson sees that gate at all. Neither runs unless you add it to your chain.",[568,569,571],"h2",{"id":570},"before-you-start","Before you start",[539,573,574,577,584],{},[542,575,576],{},"A running Kraft server.",[542,578,579,580,583],{},"A chain of your own to edit. Step 2 makes ",[530,581,582],{},"chains\u002Freviewed.yaml","; if you\nalready have a chain, edit that one.",[542,585,586,587,590,591,594,595,557],{},"Your config directory: ",[530,588,589],{},"~\u002F.kraft\u002Fconfig\u002F",", or ",[530,592,593],{},"$KRAFT_HOME\u002Fconfig\u002F"," if you set\n",[530,596,597],{},"KRAFT_HOME",[568,599,601],{"id":600},"add-a-security-review-to-verification","Add a security review to verification",[603,604,605,711,772,785],"ol",{},[542,606,607,608,611,612,615,616],{},"Add the task to ",[530,609,610],{},"library.yaml",", under ",[530,613,614],{},"tasks:",":",[617,618,624],"pre",{"className":619,"code":620,"filename":621,"language":622,"meta":623,"style":623},"language-yaml shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","security_review:\n  kind: agent\n  harness: claude\n  prompt: Review this work item's change for security defects.\n  skill: kraft:security-review\n  inputs: [review_package, carried_findings, previous_review]\n","config\u002Flibrary.yaml","yaml","",[530,625,626,639,652,663,674,685],{"__ignoreMap":623},[627,628,631,635],"span",{"class":629,"line":630},"line",1,[627,632,634],{"class":633},"sb7M8","security_review",[627,636,638],{"class":637},"s7iLA",":\n",[627,640,642,645,648],{"class":629,"line":641},2,[627,643,644],{"class":633},"  kind",[627,646,647],{"class":637},": ",[627,649,651],{"class":650},"semJd","agent\n",[627,653,655,658,660],{"class":629,"line":654},3,[627,656,657],{"class":633},"  harness",[627,659,647],{"class":637},[627,661,662],{"class":650},"claude\n",[627,664,666,669,671],{"class":629,"line":665},4,[627,667,668],{"class":633},"  prompt",[627,670,647],{"class":637},[627,672,673],{"class":650},"Review this work item's change for security defects.\n",[627,675,677,680,682],{"class":629,"line":676},5,[627,678,679],{"class":633},"  skill",[627,681,647],{"class":637},[627,683,684],{"class":650},"kraft:security-review\n",[627,686,688,691,694,697,700,703,705,708],{"class":629,"line":687},6,[627,689,690],{"class":633},"  inputs",[627,692,693],{"class":637},": [",[627,695,696],{"class":650},"review_package",[627,698,699],{"class":637},", ",[627,701,702],{"class":650},"carried_findings",[627,704,699],{"class":637},[627,706,707],{"class":650},"previous_review",[627,709,710],{"class":637},"]\n",[542,712,713,714,717,718,720,721],{},"Copy the default chain to a chain of your own. ",[530,715,716],{},"cp -n"," never overwrites a file, so if ",[530,719,582],{}," exists, skip this step and keep editing it:",[617,722,726],{"className":723,"code":724,"language":725,"meta":623,"style":623},"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\u002Freviewed.yaml\n","bash",[530,727,728,757],{"__ignoreMap":623},[627,729,730,734,737,739,743,746,749,751,754],{"class":629,"line":630},[627,731,733],{"class":732},"ssYy9","cd",[627,735,736],{"class":650}," \"${",[627,738,597],{"class":637},[627,740,742],{"class":741},"sklAV",":-",[627,744,745],{"class":637},"$HOME",[627,747,748],{"class":741},"\u002F",[627,750,557],{"class":650},[627,752,753],{"class":637},"kraft",[627,755,756],{"class":650},"}\u002Fconfig\"\n",[627,758,759,763,766,769],{"class":629,"line":641},[627,760,762],{"class":761},"szw1H","cp",[627,764,765],{"class":732}," -n",[627,767,768],{"class":650}," chains\u002Fdefault.yaml",[627,770,771],{"class":650}," chains\u002Freviewed.yaml\n",[542,773,774,775,777,778,781,782,557],{},"In ",[530,776,582],{},", change ",[530,779,780],{},"id: default"," to ",[530,783,784],{},"id: reviewed",[542,786,787,788,791,792,800,801,939,942],{},"Replace the existing ",[530,789,790],{},"- id: verification"," entry with one that runs the\nsecurity review beside the code review. A list replaces the parent's when a\nnode extends (",[553,793,795,796,799],{"href":794},"\u002Freference\u002Fchain-nodes#the-library-and-extends","how ",[530,797,798],{},"extends"," merges","),\nso write both steps out:",[617,802,805],{"className":619,"code":803,"filename":804,"language":622,"meta":623,"style":623},"- id: verification\n  extends: verification\n  steps:\n    - id: tests\n      tasks:\n        - id: test_changed_scopes\n          extends: verify_changed_scopes\n    - id: review\n      tasks:\n        - id: code_review\n          extends: code_review\n        - id: security_review\n          extends: security_review\n","config\u002Fchains\u002Freviewed.yaml",[530,806,807,820,829,836,848,855,867,878,890,897,909,918,930],{"__ignoreMap":623},[627,808,809,812,815,817],{"class":629,"line":630},[627,810,811],{"class":637},"- ",[627,813,814],{"class":633},"id",[627,816,647],{"class":637},[627,818,819],{"class":650},"verification\n",[627,821,822,825,827],{"class":629,"line":641},[627,823,824],{"class":633},"  extends",[627,826,647],{"class":637},[627,828,819],{"class":650},[627,830,831,834],{"class":629,"line":654},[627,832,833],{"class":633},"  steps",[627,835,638],{"class":637},[627,837,838,841,843,845],{"class":629,"line":665},[627,839,840],{"class":637},"    - ",[627,842,814],{"class":633},[627,844,647],{"class":637},[627,846,847],{"class":650},"tests\n",[627,849,850,853],{"class":629,"line":676},[627,851,852],{"class":633},"      tasks",[627,854,638],{"class":637},[627,856,857,860,862,864],{"class":629,"line":687},[627,858,859],{"class":637},"        - ",[627,861,814],{"class":633},[627,863,647],{"class":637},[627,865,866],{"class":650},"test_changed_scopes\n",[627,868,870,873,875],{"class":629,"line":869},7,[627,871,872],{"class":633},"          extends",[627,874,647],{"class":637},[627,876,877],{"class":650},"verify_changed_scopes\n",[627,879,881,883,885,887],{"class":629,"line":880},8,[627,882,840],{"class":637},[627,884,814],{"class":633},[627,886,647],{"class":637},[627,888,889],{"class":650},"review\n",[627,891,893,895],{"class":629,"line":892},9,[627,894,852],{"class":633},[627,896,638],{"class":637},[627,898,900,902,904,906],{"class":629,"line":899},10,[627,901,859],{"class":637},[627,903,814],{"class":633},[627,905,647],{"class":637},[627,907,908],{"class":650},"code_review\n",[627,910,912,914,916],{"class":629,"line":911},11,[627,913,872],{"class":633},[627,915,647],{"class":637},[627,917,908],{"class":650},[627,919,921,923,925,927],{"class":629,"line":920},12,[627,922,859],{"class":637},[627,924,814],{"class":633},[627,926,647],{"class":637},[627,928,929],{"class":650},"security_review\n",[627,931,933,935,937],{"class":629,"line":932},13,[627,934,872],{"class":633},[627,936,647],{"class":637},[627,938,929],{"class":650},[940,941],"br",{},"Tasks in one step run in parallel, so both reviews read the same tests-green\nchange. Their findings share the node's fix loop.",[568,944,946],{"id":945},"add-a-gate-reviewer-to-a-gate","Add a gate reviewer to a gate",[603,948,949,958,1077],{},[542,950,951,952,954,955,557],{},"Open ",[530,953,582],{},", or your own chain, and find the gate node to\nreview. This guide uses ",[530,956,957],{},"spec_approval",[542,959,960,961,964,965,967,968],{},"Add ",[530,962,963],{},"auto_review"," to it. It takes an agent task, which you write out as below\nor ",[530,966,798],{}," from the library:",[617,969,971],{"className":619,"code":970,"filename":804,"language":622,"meta":623,"style":623},"- id: spec_approval\n  kind: gate\n  message: Review and approve the specification.\n  artifact: spec\n  reject_to: spec\n  auto_review:\n    id: reviewer\n    kind: agent\n    harness: claude\n    prompt: Decide whether this gate needs a person.\n    skill: kraft:gate-review\n",[530,972,973,984,993,1003,1013,1022,1029,1039,1048,1057,1067],{"__ignoreMap":623},[627,974,975,977,979,981],{"class":629,"line":630},[627,976,811],{"class":637},[627,978,814],{"class":633},[627,980,647],{"class":637},[627,982,983],{"class":650},"spec_approval\n",[627,985,986,988,990],{"class":629,"line":641},[627,987,644],{"class":633},[627,989,647],{"class":637},[627,991,992],{"class":650},"gate\n",[627,994,995,998,1000],{"class":629,"line":654},[627,996,997],{"class":633},"  message",[627,999,647],{"class":637},[627,1001,1002],{"class":650},"Review and approve the specification.\n",[627,1004,1005,1008,1010],{"class":629,"line":665},[627,1006,1007],{"class":633},"  artifact",[627,1009,647],{"class":637},[627,1011,1012],{"class":650},"spec\n",[627,1014,1015,1018,1020],{"class":629,"line":676},[627,1016,1017],{"class":633},"  reject_to",[627,1019,647],{"class":637},[627,1021,1012],{"class":650},[627,1023,1024,1027],{"class":629,"line":687},[627,1025,1026],{"class":633},"  auto_review",[627,1028,638],{"class":637},[627,1030,1031,1034,1036],{"class":629,"line":869},[627,1032,1033],{"class":633},"    id",[627,1035,647],{"class":637},[627,1037,1038],{"class":650},"reviewer\n",[627,1040,1041,1044,1046],{"class":629,"line":880},[627,1042,1043],{"class":633},"    kind",[627,1045,647],{"class":637},[627,1047,651],{"class":650},[627,1049,1050,1053,1055],{"class":629,"line":892},[627,1051,1052],{"class":633},"    harness",[627,1054,647],{"class":637},[627,1056,662],{"class":650},[627,1058,1059,1062,1064],{"class":629,"line":899},[627,1060,1061],{"class":633},"    prompt",[627,1063,647],{"class":637},[627,1065,1066],{"class":650},"Decide whether this gate needs a person.\n",[627,1068,1069,1072,1074],{"class":629,"line":911},[627,1070,1071],{"class":633},"    skill",[627,1073,647],{"class":637},[627,1075,1076],{"class":650},"kraft:gate-review\n",[542,1078,1079,1080,1083,1084,1088,1089,1092,1093,1095],{},"Leave out ",[530,1081,1082],{},"fallback:",". A gate review launches its reviewer once, so Kraft\nrefuses the task at launch if it selects an\n",[553,1085,1087],{"href":1086},"\u002Fconcepts\u002Fvocabulary#agent-profile","agent profile"," (",[530,1090,1091],{},"profile:",") whose tier has\na ",[530,1094,1082],{}," list.",[526,1097,1098,1099,1101,1102,1105,1106,1110,1111,1114,1115,1119],{},"Auto-gate is on by default for an item you file, so adding ",[530,1100,963],{}," starts a\npaid reviewer agent on every such item that reaches the gate. An item filed by a\nschedule, ",[530,1103,1104],{},"POST \u002Fapi\u002Ftriggers"," or ",[553,1107,1109],{"href":1108},"\u002Fconcepts\u002Fvocabulary#auto-intake","auto-intake"," has it off, and ",[530,1112,1113],{},"--no-auto-gate","\nopts one more item out. ",[553,1116,1118],{"href":1117},"\u002Freference\u002Fcli\u002Fitem#filing-a-work-item","Filing a work item","\nhas the rule.",[1121,1122,1124],"h3",{"id":1123},"what-the-reviewer-can-decide","What the reviewer can decide",[526,1126,1127,1128,1132,1133,699,1136,699,1139,590,1142,1145,1146,1149],{},"The reviewer runs as a ",[553,1129,1131],{"href":1130},"\u002Fconcepts\u002Fvocabulary#worker","worker",", so Kraft refuses it if it tries to approve or\nreject. It reports one of ",[530,1134,1135],{},"approve",[530,1137,1138],{},"reject",[530,1140,1141],{},"fixed",[530,1143,1144],{},"undecided",", and Kraft\napplies the verdict. ",[553,1147,406],{"href":1148},"\u002Freference\u002Fchain-nodes\u002Fresult-file#verdict","\nsays what each one does.",[526,1151,1152,1153,1155,1156,1159,1160,1164,1165,1168],{},"If the reviewer reports nothing or an unknown value, Kraft records ",[530,1154,1144],{},":\nthe gate waits for a person, who sees the reviewer's concerns first.\n",[530,1157,1158],{},"auto_review_attempts"," in ",[553,1161,1162],{"href":319},[530,1163,318],{},"\n(default ",[530,1166,1167],{},"1",") bounds how many attempts one pending gate gets.",[568,1170,1172],{"id":1171},"check-it-worked","Check it worked",[603,1174,1175,1265,1292],{},[542,1176,1177,1178,1222,1224,1225,1241,1243,1244,1247,1248,1251,1252,1255,1256,1258,1259,1261,1262,1264],{},"Lint the files, make the server read them, and print the chain with the\nlibrary expanded:",[617,1179,1181],{"className":723,"code":1180,"language":725,"meta":623,"style":623},"kraft admin templates lint\nkraft admin reload\nkraft admin templates show reviewed --resolved\n",[530,1182,1183,1196,1205],{"__ignoreMap":623},[627,1184,1185,1187,1190,1193],{"class":629,"line":630},[627,1186,753],{"class":761},[627,1188,1189],{"class":650}," admin",[627,1191,1192],{"class":650}," templates",[627,1194,1195],{"class":650}," lint\n",[627,1197,1198,1200,1202],{"class":629,"line":641},[627,1199,753],{"class":761},[627,1201,1189],{"class":650},[627,1203,1204],{"class":650}," reload\n",[627,1206,1207,1209,1211,1213,1216,1219],{"class":629,"line":654},[627,1208,753],{"class":761},[627,1210,1189],{"class":650},[627,1212,1192],{"class":650},[627,1214,1215],{"class":650}," show",[627,1217,1218],{"class":650}," reviewed",[627,1220,1221],{"class":732}," --resolved\n",[940,1223],{},"A pass prints these lines (the counts are your own):",[617,1226,1231],{"className":1227,"code":1229,"language":1230,"meta":623},[1228],"language-text","3 chain(s), no errors\nreloaded 3 template(s) and policy.yaml and intake.yaml\n","text",[530,1232,1233,1237],{"__ignoreMap":623},[627,1234,1236],{"className":1235},[629],"3 chain(s), no errors\n",[627,1238,1240],{"className":1239},[629],"reloaded 3 template(s) and policy.yaml and intake.yaml\n",[940,1242],{},"The first line is ",[530,1245,1246],{},"lint","'s, the second ",[530,1249,1250],{},"reload","'s. In the ",[530,1253,1254],{},"show"," output, look for ",[530,1257,634],{}," under ",[530,1260,536],{},", and ",[530,1263,963],{}," on the\ngate.",[542,1266,1267,1268],{},"File an item on the chain:",[617,1269,1271],{"className":723,"code":1270,"language":725,"meta":623,"style":623},"kraft item create \"title\" --chain reviewed\n",[530,1272,1273],{"__ignoreMap":623},[627,1274,1275,1277,1280,1283,1286,1289],{"class":629,"line":630},[627,1276,753],{"class":761},[627,1278,1279],{"class":650}," item",[627,1281,1282],{"class":650}," create",[627,1284,1285],{"class":650}," \"title\"",[627,1287,1288],{"class":732}," --chain",[627,1290,1291],{"class":650}," reviewed\n",[542,1293,1294,1295,1297,1298,1337,1339,1340,1343,1344,1347,1348,1351],{},"When the item has passed the tests in ",[530,1296,536],{},", list the findings, and\nwhen it reaches the reviewed gate, list the reviewer's start:",[617,1299,1301],{"className":723,"code":1300,"language":725,"meta":623,"style":623},"kraft view events ID --type findings_measured\nkraft view events ID --type gate_auto_review_started\n",[530,1302,1303,1322],{"__ignoreMap":623},[627,1304,1305,1307,1310,1313,1316,1319],{"class":629,"line":630},[627,1306,753],{"class":761},[627,1308,1309],{"class":650}," view",[627,1311,1312],{"class":650}," events",[627,1314,1315],{"class":650}," ID",[627,1317,1318],{"class":732}," --type",[627,1320,1321],{"class":650}," findings_measured\n",[627,1323,1324,1326,1328,1330,1332,1334],{"class":629,"line":641},[627,1325,753],{"class":761},[627,1327,1309],{"class":650},[627,1329,1312],{"class":650},[627,1331,1315],{"class":650},[627,1333,1318],{"class":732},[627,1335,1336],{"class":650}," gate_auto_review_started\n",[940,1338],{},"A security finding shows in ",[530,1341,1342],{},"findings_measured"," like any review finding. A\ngate review that ran shows one ",[530,1345,1346],{},"gate_auto_review_started"," row. A\n",[530,1349,1350],{},"gate_auto_review_skipped"," row means the reviewer left the gate to a person.",[568,1353,1355],{"id":1354},"next-steps","Next steps",[539,1357,1358,1367,1372,1378],{},[542,1359,1360,1363,1364,1366],{},[553,1361,392],{"href":1362},"\u002Freference\u002Fchain-nodes#gate-node-keys",": every key a gate takes, ",[530,1365,963],{}," included.",[542,1368,1369,1371],{},[553,1370,1118],{"href":1117},": which items have auto-gate on, and how to turn it off.",[542,1373,1374,1377],{},[553,1375,482],{"href":1376},"\u002Freference\u002Fevents#gates-and-review",": the events a gate review records.",[542,1379,1380,1382],{},[553,1381,102],{"href":103},": add a node of your own to the same chain.",[1384,1385,1386],"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}",{"title":623,"searchDepth":641,"depth":641,"links":1388},[1389,1390,1391,1394,1395],{"id":570,"depth":641,"text":571},{"id":600,"depth":641,"text":601},{"id":945,"depth":641,"text":946,"children":1392},[1393],{"id":1123,"depth":654,"text":1124},{"id":1171,"depth":641,"text":1172},{"id":1354,"depth":641,"text":1355},"Add the shipped security-review and gate-review skills to a chain of your own, since no shipped chain uses them.","md",null,{},true,{"title":106,"description":1396},"Jc6gUc5tXug2R4juIv3Wa8VQ9OsrCLob0VTjlIMgVUw",[1404,1406],{"title":102,"path":103,"stem":104,"description":1405,"children":-1},"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.",{"title":110,"path":111,"stem":112,"description":1407,"children":-1},"File a paused work item on a cron schedule or from a webhook, then check that it arrived.",1791801161226]