[{"data":1,"prerenderedAt":1424},["ShallowReactive",2],{"navigation_docs":3,"-guides-day-to-day-notifications":520,"-guides-day-to-day-notifications-surround":1419},[4,28,51,191,222,485],{"title":5,"path":6,"stem":7,"children":8},"Get started","\u002Fget-started","1.get-started",[9,12,16,20,24],{"title":10,"path":6,"stem":11},"Overview","1.get-started\u002Findex",{"title":13,"path":14,"stem":15},"Why Kraft","\u002Fget-started\u002Fwhy-kraft","1.get-started\u002F0.why-kraft",{"title":17,"path":18,"stem":19},"Install","\u002Fget-started\u002Finstall","1.get-started\u002F1.install",{"title":21,"path":22,"stem":23},"Your first work item","\u002Fget-started\u002Ffirst-work-item","1.get-started\u002F2.first-work-item",{"title":25,"path":26,"stem":27},"FAQ","\u002Fget-started\u002Ffaq","1.get-started\u002F3.faq",{"title":29,"path":30,"stem":31,"children":32},"Concepts","\u002Fconcepts","2.concepts",[33,35,39,43,47],{"title":10,"path":30,"stem":34},"2.concepts\u002Findex",{"title":36,"path":37,"stem":38},"How a work item runs","\u002Fconcepts\u002Fhow-a-work-item-runs","2.concepts\u002F1.how-a-work-item-runs",{"title":40,"path":41,"stem":42},"Caps and budgets","\u002Fconcepts\u002Fcaps-and-budgets","2.concepts\u002F2.caps-and-budgets",{"title":44,"path":45,"stem":46},"Why a permission gate","\u002Fconcepts\u002Fpermission-gate","2.concepts\u002F3.permission-gate",{"title":48,"path":49,"stem":50},"Vocabulary","\u002Fconcepts\u002Fvocabulary","2.concepts\u002F4.vocabulary",{"title":52,"path":53,"stem":54,"children":55},"Guides","\u002Fguides","3.guides",[56,58,96,117,138,187],{"title":10,"path":53,"stem":57},"3.guides\u002Findex",{"title":59,"path":60,"stem":61,"children":62,"page":95},"Day to day","\u002Fguides\u002Fday-to-day","3.guides\u002F1.day-to-day",[63,67,71,75,79,83,87,91],{"title":64,"path":65,"stem":66},"The setup wizard on first start","\u002Fguides\u002Fday-to-day\u002Ffirst-run","3.guides\u002F1.day-to-day\u002F2.first-run",{"title":68,"path":69,"stem":70},"File a work item","\u002Fguides\u002Fday-to-day\u002Ffile-a-work-item","3.guides\u002F1.day-to-day\u002F3.file-a-work-item",{"title":72,"path":73,"stem":74},"Use Kraft from your agent","\u002Fguides\u002Fday-to-day\u002Fagent-integration","3.guides\u002F1.day-to-day\u002F4.agent-integration",{"title":76,"path":77,"stem":78},"Reviewing a change","\u002Fguides\u002Fday-to-day\u002Freview-a-change","3.guides\u002F1.day-to-day\u002F5.review-a-change",{"title":80,"path":81,"stem":82},"Raise a cap on a stopped item","\u002Fguides\u002Fday-to-day\u002Fraise-a-cap","3.guides\u002F1.day-to-day\u002F6.raise-a-cap",{"title":84,"path":85,"stem":86},"Kraft for VS Code","\u002Fguides\u002Fday-to-day\u002Fvscode","3.guides\u002F1.day-to-day\u002F7.vscode",{"title":88,"path":89,"stem":90},"Kraft on a phone","\u002Fguides\u002Fday-to-day\u002Fkraft-on-a-phone","3.guides\u002F1.day-to-day\u002F8.kraft-on-a-phone",{"title":92,"path":93,"stem":94},"Get notified when an item needs you","\u002Fguides\u002Fday-to-day\u002Fnotifications","3.guides\u002F1.day-to-day\u002F9.notifications",false,{"title":97,"path":98,"stem":99,"children":100,"page":95},"Customize and automate","\u002Fguides\u002Fcustomize","3.guides\u002F2.customize",[101,105,109,113],{"title":102,"path":103,"stem":104},"Write your own chain","\u002Fguides\u002Fcustomize\u002Fwrite-your-own-chain","3.guides\u002F2.customize\u002F1.write-your-own-chain",{"title":106,"path":107,"stem":108},"Add a security review or a gate reviewer","\u002Fguides\u002Fcustomize\u002Fadd-review-agents","3.guides\u002F2.customize\u002F2.add-review-agents",{"title":110,"path":111,"stem":112},"Schedule or webhook work","\u002Fguides\u002Fcustomize\u002Fschedule-and-webhook-work","3.guides\u002F2.customize\u002F3.schedule-and-webhook-work",{"title":114,"path":115,"stem":116},"Share chains with add-ons","\u002Fguides\u002Fcustomize\u002Fshare-chains-with-addons","3.guides\u002F2.customize\u002F4.share-chains-with-addons",{"title":118,"path":119,"stem":120,"children":121,"page":95},"Agents and harnesses","\u002Fguides\u002Fharnesses","3.guides\u002F3.harnesses",[122,126,130,134],{"title":123,"path":124,"stem":125},"Switch a task to another harness","\u002Fguides\u002Fharnesses\u002Fswitch-harness","3.guides\u002F3.harnesses\u002F1.switch-harness",{"title":127,"path":128,"stem":129},"Add or override a harness","\u002Fguides\u002Fharnesses\u002Fadding-a-harness","3.guides\u002F3.harnesses\u002F2.adding-a-harness",{"title":131,"path":132,"stem":133},"Build a worker Kit","\u002Fguides\u002Fharnesses\u002Fworker-kit","3.guides\u002F3.harnesses\u002F3.worker-kit",{"title":135,"path":136,"stem":137},"Give a worker its login","\u002Fguides\u002Fharnesses\u002Fgive-a-worker-its-login","3.guides\u002F3.harnesses\u002F4.give-a-worker-its-login",{"title":139,"path":140,"stem":141,"children":142,"page":95},"Run the server","\u002Fguides\u002Frun","3.guides\u002F4.run",[143,147,151,155,159,163,167,171,175,179,183],{"title":144,"path":145,"stem":146},"Remote access","\u002Fguides\u002Frun\u002Fremote-access","3.guides\u002F4.run\u002F01.remote-access",{"title":148,"path":149,"stem":150},"Put a proxy in front of Kraft","\u002Fguides\u002Frun\u002Fput-a-proxy-in-front-of-kraft","3.guides\u002F4.run\u002F02.put-a-proxy-in-front-of-kraft",{"title":152,"path":153,"stem":154},"Restart Kraft without ending running agents","\u002Fguides\u002Frun\u002Frestart-kraft","3.guides\u002F4.run\u002F03.restart-kraft",{"title":156,"path":157,"stem":158},"Back up and restore the database","\u002Fguides\u002Frun\u002Fback-up-and-restore","3.guides\u002F4.run\u002F04.back-up-and-restore",{"title":160,"path":161,"stem":162},"Logs and disk space","\u002Fguides\u002Frun\u002Flogs-and-disk-space","3.guides\u002F4.run\u002F05.logs-and-disk-space",{"title":164,"path":165,"stem":166},"Run Kraft as a service","\u002Fguides\u002Frun\u002Frun-as-a-service","3.guides\u002F4.run\u002F06.run-as-a-service",{"title":168,"path":169,"stem":170},"Upgrade Kraft","\u002Fguides\u002Frun\u002Fupgrade-kraft","3.guides\u002F4.run\u002F07.upgrade-kraft",{"title":172,"path":173,"stem":174},"Upgrade your configuration","\u002Fguides\u002Frun\u002Fupgrade-your-configuration","3.guides\u002F4.run\u002F08.upgrade-your-configuration",{"title":176,"path":177,"stem":178},"Upgrade from 1.4","\u002Fguides\u002Frun\u002Fupgrade-from-1-4","3.guides\u002F4.run\u002F09.upgrade-from-1-4",{"title":180,"path":181,"stem":182},"Upgrade from 0.x or a release candidate","\u002Fguides\u002Frun\u002Fupgrade-from-0-x-or-a-release-candidate","3.guides\u002F4.run\u002F10.upgrade-from-0-x-or-a-release-candidate",{"title":184,"path":185,"stem":186},"Roll back to 1.4","\u002Fguides\u002Frun\u002Froll-back","3.guides\u002F4.run\u002F11.roll-back",{"title":188,"path":189,"stem":190},"Kraft Lite","\u002Fguides\u002Fkraft-lite","3.guides\u002F5.kraft-lite",{"title":192,"path":193,"stem":194,"children":195},"Troubleshooting","\u002Ftroubleshooting","4.troubleshooting",[196,198,202,206,210,214,218],{"title":10,"path":193,"stem":197},"4.troubleshooting\u002Findex",{"title":199,"path":200,"stem":201},"Why did my item stop?","\u002Ftroubleshooting\u002Fwhy-did-my-item-stop","4.troubleshooting\u002F1.why-did-my-item-stop",{"title":203,"path":204,"stem":205},"Stop reasons in detail","\u002Ftroubleshooting\u002Fstop-reasons-in-detail","4.troubleshooting\u002F2.stop-reasons-in-detail",{"title":207,"path":208,"stem":209},"Starting and reaching Kraft","\u002Ftroubleshooting\u002Fstarting-and-reaching-kraft","4.troubleshooting\u002F3.starting-and-reaching-kraft",{"title":211,"path":212,"stem":213},"Doctor failures","\u002Ftroubleshooting\u002Fdoctor-failures","4.troubleshooting\u002F4.doctor-failures",{"title":215,"path":216,"stem":217},"Sandbox and Kit stops","\u002Ftroubleshooting\u002Fsandbox-and-kit-stops","4.troubleshooting\u002F5.sandbox-and-kit-stops",{"title":219,"path":220,"stem":221},"Add-on problems","\u002Ftroubleshooting\u002Faddon-problems","4.troubleshooting\u002F6.addon-problems",{"title":223,"path":224,"stem":225,"children":226},"Reference","\u002Freference","5.reference",[227,229,267,289,293,391,409,435,439,443,477,481],{"title":10,"path":224,"stem":228},"5.reference\u002Findex",{"title":230,"path":231,"stem":232,"children":233},"Web UI","\u002Freference\u002Fweb-ui","5.reference\u002F00.web-ui\u002Findex",[234,235,239,243,247,251,255,259,263],{"title":10,"path":231,"stem":232},{"title":236,"path":237,"stem":238},"Sidebar, search, and keyboard","\u002Freference\u002Fweb-ui\u002Fsidebar-search-and-keyboard","5.reference\u002F00.web-ui\u002F0.sidebar-search-and-keyboard",{"title":240,"path":241,"stem":242},"The board","\u002Freference\u002Fweb-ui\u002Fboard","5.reference\u002F00.web-ui\u002F1.board",{"title":244,"path":245,"stem":246},"An item's page","\u002Freference\u002Fweb-ui\u002Fitem-page","5.reference\u002F00.web-ui\u002F2.item-page",{"title":248,"path":249,"stem":250},"Fix loops and test scopes","\u002Freference\u002Fweb-ui\u002Ffix-loops-and-test-scopes","5.reference\u002F00.web-ui\u002F3.fix-loops-and-test-scopes",{"title":252,"path":253,"stem":254},"Config before an item starts","\u002Freference\u002Fweb-ui\u002Fconfig-before-start","5.reference\u002F00.web-ui\u002F4.config-before-start",{"title":256,"path":257,"stem":258},"The review page","\u002Freference\u002Fweb-ui\u002Freview-page","5.reference\u002F00.web-ui\u002F5.review-page",{"title":260,"path":261,"stem":262},"Templates and Settings","\u002Freference\u002Fweb-ui\u002Ftemplates-and-settings","5.reference\u002F00.web-ui\u002F6.templates-and-settings",{"title":264,"path":265,"stem":266},"Analytics","\u002Freference\u002Fweb-ui\u002Fanalytics","5.reference\u002F00.web-ui\u002F7.analytics",{"title":268,"path":269,"stem":270,"children":271},"CLI","\u002Freference\u002Fcli","5.reference\u002F01.cli\u002Findex",[272,273,277,281,285],{"title":10,"path":269,"stem":270},{"title":274,"path":275,"stem":276},"Item verbs","\u002Freference\u002Fcli\u002Fitem","5.reference\u002F01.cli\u002F2.item",{"title":278,"path":279,"stem":280},"View verbs","\u002Freference\u002Fcli\u002Fview","5.reference\u002F01.cli\u002F3.view",{"title":282,"path":283,"stem":284},"Repo verbs","\u002Freference\u002Fcli\u002Frepo","5.reference\u002F01.cli\u002F4.repo",{"title":286,"path":287,"stem":288},"Admin verbs","\u002Freference\u002Fcli\u002Fadmin","5.reference\u002F01.cli\u002F5.admin",{"title":290,"path":291,"stem":292},"Work item statuses","\u002Freference\u002Fstatuses","5.reference\u002F02.statuses",{"title":294,"path":295,"stem":296,"children":297},"Configuration","\u002Freference\u002Fconfiguration","5.reference\u002F03.configuration\u002Findex",[298,299,317,321,325,329,333,337,341,345,379,383,387],{"title":10,"path":295,"stem":296},{"title":300,"path":301,"stem":302,"children":303},"repos.yaml","\u002Freference\u002Fconfiguration\u002Frepos","5.reference\u002F03.configuration\u002F02.repos\u002Findex",[304,305,309,313],{"title":10,"path":301,"stem":302},{"title":306,"path":307,"stem":308},"How connect proposes commands","\u002Freference\u002Fconfiguration\u002Frepos\u002Fconnect-proposals","5.reference\u002F03.configuration\u002F02.repos\u002F1.connect-proposals",{"title":310,"path":311,"stem":312},"detectors.yaml","\u002Freference\u002Fconfiguration\u002Frepos\u002Fdetectors","5.reference\u002F03.configuration\u002F02.repos\u002F2.detectors",{"title":314,"path":315,"stem":316},"Workspaces","\u002Freference\u002Fconfiguration\u002Frepos\u002Fworkspaces","5.reference\u002F03.configuration\u002F02.repos\u002F3.workspaces",{"title":318,"path":319,"stem":320},"policy.yaml","\u002Freference\u002Fconfiguration\u002Fpolicy","5.reference\u002F03.configuration\u002F03.policy",{"title":322,"path":323,"stem":324},"Library and chains","\u002Freference\u002Fconfiguration\u002Flibrary-and-chains","5.reference\u002F03.configuration\u002F04.library-and-chains",{"title":326,"path":327,"stem":328},"harnesses.yaml","\u002Freference\u002Fconfiguration\u002Fharnesses-file","5.reference\u002F03.configuration\u002F05.harnesses-file",{"title":330,"path":331,"stem":332},"access.yaml","\u002Freference\u002Fconfiguration\u002Faccess","5.reference\u002F03.configuration\u002F06.access",{"title":334,"path":335,"stem":336},"intake.yaml","\u002Freference\u002Fconfiguration\u002Fintake","5.reference\u002F03.configuration\u002F07.intake",{"title":338,"path":339,"stem":340},"notify.yaml","\u002Freference\u002Fconfiguration\u002Fnotify","5.reference\u002F03.configuration\u002F08.notify",{"title":342,"path":343,"stem":344},"theme.yaml","\u002Freference\u002Fconfiguration\u002Ftheme","5.reference\u002F03.configuration\u002F09.theme",{"title":346,"path":347,"stem":348,"children":349},"Sandboxed workers","\u002Freference\u002Fconfiguration\u002Fsandbox","5.reference\u002F03.configuration\u002F10.sandbox\u002Findex",[350,351,355,359,363,367,371,375],{"title":10,"path":347,"stem":348},{"title":352,"path":353,"stem":354},"Resource limits","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fresource-limits","5.reference\u002F03.configuration\u002F10.sandbox\u002F1.resource-limits",{"title":356,"path":357,"stem":358},"Callbacks from a sandbox","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fcallbacks","5.reference\u002F03.configuration\u002F10.sandbox\u002F2.callbacks",{"title":360,"path":361,"stem":362},"Network policy","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fnetwork-policy","5.reference\u002F03.configuration\u002F10.sandbox\u002F3.network-policy",{"title":364,"path":365,"stem":366},"Credentials","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fcredentials","5.reference\u002F03.configuration\u002F10.sandbox\u002F4.credentials",{"title":368,"path":369,"stem":370},"Kits","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fkits","5.reference\u002F03.configuration\u002F10.sandbox\u002F5.kits",{"title":372,"path":373,"stem":374},"sandbox.yaml","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fsandbox-yaml","5.reference\u002F03.configuration\u002F10.sandbox\u002F6.sandbox-yaml",{"title":376,"path":377,"stem":378},"Git in a sandbox","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fgit-in-a-sandbox","5.reference\u002F03.configuration\u002F10.sandbox\u002F7.git-in-a-sandbox",{"title":380,"path":381,"stem":382},"Environment variables","\u002Freference\u002Fconfiguration\u002Fenvironment-variables","5.reference\u002F03.configuration\u002F11.environment-variables",{"title":384,"path":385,"stem":386},"Add-ons and collections","\u002Freference\u002Fconfiguration\u002Faddons","5.reference\u002F03.configuration\u002F12.addons",{"title":388,"path":389,"stem":390},"Repo libraries","\u002Freference\u002Fconfiguration\u002Frepo-libraries","5.reference\u002F03.configuration\u002F13.repo-libraries",{"title":392,"path":393,"stem":394,"children":395},"Chain file keys","\u002Freference\u002Fchain-nodes","5.reference\u002F04.chain-nodes\u002Findex",[396,397,401,405],{"title":10,"path":393,"stem":394},{"title":398,"path":399,"stem":400},"Subprocess tasks","\u002Freference\u002Fchain-nodes\u002Fsubprocess-tasks","5.reference\u002F04.chain-nodes\u002F2.subprocess-tasks",{"title":402,"path":403,"stem":404},"Fix loop and judge","\u002Freference\u002Fchain-nodes\u002Ffix-loop","5.reference\u002F04.chain-nodes\u002F3.fix-loop",{"title":406,"path":407,"stem":408},"Result file","\u002Freference\u002Fchain-nodes\u002Fresult-file","5.reference\u002F04.chain-nodes\u002F4.result-file",{"title":410,"path":411,"stem":412,"children":413},"Agent harnesses","\u002Freference\u002Fharnesses","5.reference\u002F05.harnesses\u002Findex",[414,415,419,423,427,431],{"title":10,"path":411,"stem":412},{"title":416,"path":417,"stem":418},"Unattended runs","\u002Freference\u002Fharnesses\u002Funattended-runs","5.reference\u002F05.harnesses\u002F2.unattended-runs",{"title":420,"path":421,"stem":422},"Agent profiles","\u002Freference\u002Fharnesses\u002Fagent-profiles","5.reference\u002F05.harnesses\u002F3.agent-profiles",{"title":424,"path":425,"stem":426},"Harness definition files","\u002Freference\u002Fharnesses\u002Fharness-files","5.reference\u002F05.harnesses\u002F4.harness-files",{"title":428,"path":429,"stem":430},"Fallback and escalation","\u002Freference\u002Fharnesses\u002Ffallback-and-escalation","5.reference\u002F05.harnesses\u002F5.fallback-and-escalation",{"title":432,"path":433,"stem":434},"Cost reporting","\u002Freference\u002Fharnesses\u002Fcost-reporting","5.reference\u002F05.harnesses\u002F6.cost-reporting",{"title":436,"path":437,"stem":438},"Permission gate","\u002Freference\u002Fpermissions","5.reference\u002F06.permissions",{"title":440,"path":441,"stem":442},"Inbound triggers","\u002Freference\u002Ftriggers","5.reference\u002F07.triggers",{"title":444,"path":445,"stem":446,"children":447},"HTTP API","\u002Freference\u002Fhttp-api","5.reference\u002F08.http-api\u002Findex",[448,449,453,457,461,465,469,473],{"title":10,"path":445,"stem":446},{"title":450,"path":451,"stem":452},"Filing, reading and changing work items","\u002Freference\u002Fhttp-api\u002Fwork-items","5.reference\u002F08.http-api\u002F2.work-items",{"title":454,"path":455,"stem":456},"Gates, run control, ending and retry","\u002Freference\u002Fhttp-api\u002Fgates-run-control-and-ending","5.reference\u002F08.http-api\u002F3.gates-run-control-and-ending",{"title":458,"path":459,"stem":460},"The work item object","\u002Freference\u002Fhttp-api\u002Fwork-item-object","5.reference\u002F08.http-api\u002F4.work-item-object",{"title":462,"path":463,"stem":464},"Budget, events, diff and documents","\u002Freference\u002Fhttp-api\u002Fbudget-and-events","5.reference\u002F08.http-api\u002F5.budget-and-events",{"title":466,"path":467,"stem":468},"Repos, chains, harnesses and the server","\u002Freference\u002Fhttp-api\u002Frepos-chains-harnesses-and-server","5.reference\u002F08.http-api\u002F6.repos-chains-harnesses-and-server",{"title":470,"path":471,"stem":472},"Drafts","\u002Freference\u002Fhttp-api\u002Fdrafts","5.reference\u002F08.http-api\u002F7.drafts",{"title":474,"path":475,"stem":476},"Ops for each draft area","\u002Freference\u002Fhttp-api\u002Fdraft-ops","5.reference\u002F08.http-api\u002F8.draft-ops",{"title":478,"path":479,"stem":480},"MCP tools","\u002Freference\u002Fmcp-tools","5.reference\u002F09.mcp-tools",{"title":482,"path":483,"stem":484},"Events","\u002Freference\u002Fevents","5.reference\u002F10.events",{"title":486,"path":487,"stem":488,"children":489},"Security and project","\u002Fproject","6.project",[490,492,496,500,504,508,512,516],{"title":10,"path":487,"stem":491},"6.project\u002Findex",{"title":493,"path":494,"stem":495},"Security","\u002Fproject\u002Fsecurity","6.project\u002F1.security",{"title":497,"path":498,"stem":499},"Data and privacy","\u002Fproject\u002Fdata-and-privacy","6.project\u002F2.data-and-privacy",{"title":501,"path":502,"stem":503},"What's new in 2.0","\u002Fproject\u002Fwhats-new","6.project\u002F3.whats-new",{"title":505,"path":506,"stem":507},"Status and support","\u002Fproject\u002Fstatus-and-support","6.project\u002F4.status-and-support",{"title":509,"path":510,"stem":511},"Architecture","\u002Fproject\u002Farchitecture","6.project\u002F5.architecture",{"title":513,"path":514,"stem":515},"Source map","\u002Fproject\u002Fsource-map","6.project\u002F6.source-map",{"title":517,"path":518,"stem":519},"Contributing","\u002Fproject\u002Fcontributing","6.project\u002F7.contributing",{"id":521,"title":92,"body":522,"description":1412,"extension":1413,"links":1414,"meta":1415,"navigation":1416,"path":93,"seo":1417,"stem":94,"__hash__":1418},"docs\u002F3.guides\u002F1.day-to-day\u002F9.notifications.md",{"type":523,"value":524,"toc":1404},"minimark",[525,535,540,564,568,626,629,837,864,868,871,945,958,971,982,1070,1083,1091,1095,1150,1153,1162,1370,1374,1400],[526,527,528,529,534],"p",{},"Set up one channel and send a test through it, so Kraft tells you when a ",[530,531,533],"a",{"href":532},"\u002Fconcepts\u002Fvocabulary#work-item","work item"," needs a decision or has stopped and you do not have to watch the board.",[536,537,539],"h2",{"id":538},"before-you-start","Before you start",[541,542,543,550,557],"ul",{},[544,545,546,547,549],"li",{},"Kraft running, with the board open in a browser. See ",[530,548,17],{"href":18},".",[544,551,552,553,549],{},"Nothing else for a browser alert. For a webhook, the URL of a service that accepts a JSON ",[554,555,556],"code",{},"POST",[544,558,559,560,563],{},"For a webhook, know that Kraft sends one fixed JSON body and cannot reshape it. A service that needs another format needs a receiver in between that translates it. ",[530,561,482],{"href":562},"\u002Freference\u002Fevents#notifications"," shows the body.",[536,565,567],{"id":566},"choose-a-channel","Choose a channel",[569,570,571,586],"table",{},[572,573,574],"thead",{},[575,576,577,580,583],"tr",{},[578,579],"th",{},[578,581,582],{},"Webhook",[578,584,585],{},"This browser",[587,588,589,601,612],"tbody",{},[575,590,591,595,598],{},[592,593,594],"td",{},"Sent by",[592,596,597],{},"The Kraft server, so no browser has to be open.",[592,599,600],{},"The Kraft page, so a Kraft tab has to be open.",[575,602,603,606,609],{},[592,604,605],{},"Reaches you",[592,607,608],{},"In the service behind the URL.",[592,610,611],{},"As a system notification, while that tab is hidden.",[575,613,614,617,623],{},[592,615,616],{},"Kept",[592,618,619,620,549],{},"For the whole install, in ",[554,621,622],{},"config\u002Fnotify.yaml",[592,624,625],{},"In that browser only.",[526,627,628],{},"You can turn on both. Each sends only for the events you chose on it.",[630,631,633,768],"tabs",{"sync":632},"channel",[634,635,636,740,743,758],"tabs-item",{"label":582},[637,638,639,654,672,695,712,723,730],"ol",{},[544,640,641,642,646,647,649,650,653],{},"Open ",[643,644,645],"strong",{},"Settings › Notifications"," and select the ",[643,648,582],{}," card. Its pane opens on the ",[643,651,652],{},"Config"," tab.",[544,655,656,657,660,661,664,665,668,669,671],{},"Paste the service's URL into ",[643,658,659],{},"Webhook URL",". It must start with ",[554,662,663],{},"http:\u002F\u002F"," or ",[554,666,667],{},"https:\u002F\u002F",". It usually carries a token, so Kraft never shows it back. A message names the item's title, so see ",[530,670,497],{"href":498}," before you point it at a service you do not run.",[544,673,674,675,678,679,682,683,686,687,690,691,694],{},"Set ",[643,676,677],{},"Link back"," to an address the device reading the message can open, such as ",[554,680,681],{},"http:\u002F\u002F192.168.1.20:8765",". Left empty, the link uses the address and port Kraft is bound to: ",[554,684,685],{},"http:\u002F\u002F127.0.0.1:8765"," by default, which opens only on the machine Kraft runs on, and ",[554,688,689],{},"http:\u002F\u002F0.0.0.0:8765"," on a server bound to ",[554,692,693],{},"0.0.0.0",", which opens nowhere.",[544,696,697,698,701,702,704,705,708,709,549],{},"Click ",[643,699,700],{},"Save",". Kraft writes ",[554,703,622],{}," with mode ",[554,706,707],{},"0600",", and says ",[554,710,711],{},"Saved · writes notify.yaml",[544,713,714,715,718,719,722],{},"Turn on ",[643,716,717],{},"Webhook notifications",". It saves as you switch it. If Kraft answers ",[554,720,721],{},"set a webhook URL before enabling notifications",", the URL is not saved yet: do step 4 first.",[544,724,725,726,729],{},"Under ",[643,727,728],{},"Notifies",", switch off an event you do not want. Both are on until you do.",[544,731,725,732,735,736,739],{},[643,733,734],{},"Test",", click ",[643,737,738],{},"Send a test",". The button works only while the webhook is on.",[526,741,742],{},"The line beside the button then reads like this, with the status the service answered and the time it took:",[744,745,751],"pre",{"className":746,"code":748,"language":749,"meta":750},[747],"language-text","last delivered just now · 200 · 123 ms\n","text","",[554,752,753],{"__ignoreMap":750},[754,755,748],"span",{"className":756},[757],"line",[526,759,760,761,764,765,767],{},"The test sends ",[554,762,763],{},"\"type\": \"test\""," and no item. The service receives the title ",[554,766,738],{},". Kraft does not follow a redirect.",[634,769,770,820,834],{"label":585},[637,771,772,781,803,808,813],{},[544,773,774,775,646,777,649,779,653],{},"Open Kraft in the browser you want the alerts in. Open ",[643,776,645],{},[643,778,585],{},[643,780,652],{},[544,782,783,784,787,788,735,791,794,795,798,799,802],{},"Read the note under ",[643,785,786],{},"Status",". If it says ",[554,789,790],{},"This browser has not been asked yet.",[643,792,793],{},"Allow notifications"," and allow them in the browser's prompt. If it says ",[554,796,797],{},"Blocked in the browser's site settings.",", allow notifications for Kraft's address in the browser's own site settings: Kraft cannot ask again. If it says ",[554,800,801],{},"This browser has no notifications.",", use the webhook.",[544,804,714,805,549],{},[643,806,807],{},"Alerts on this device",[544,809,725,810,812],{},[643,811,728],{},", switch off an event you do not want. This browser keeps its own choice. Both are on until you do.",[544,814,725,815,735,817,819],{},[643,816,734],{},[643,818,738],{},". The button works only while the switch is on and the browser allows notifications.",[526,821,822,823,826,827,830,831,549],{},"The test shows an alert titled ",[554,824,825],{},"Test alert"," with the text ",[554,828,829],{},"a decision is waiting",", and the line beside the button reads ",[554,832,833],{},"last shown just now",[526,835,836],{},"Keep a Kraft tab open. Alerts come from that page, and only while it is hidden, for example behind another tab or with the window minimized. Clicking an alert brings the window forward and opens the item.",[526,838,839,840,843,844,846,847,850,851,853,854,857,858,860,861,863],{},"On a phone, open ",[643,841,842],{},"More › Notifications",". The channels are ",[643,845,582],{}," and ",[643,848,849],{},"Browser alerts",", and each field saves when you edit it, with no ",[643,852,700],{}," button. The phone words some results differently, such as ",[554,855,856],{},"failed 1m ago: ConnectError",", and its ",[643,859,849],{}," screen has no ",[643,862,728],{}," switches, so choosing events there is a desktop step. This guide's quoted texts are the desktop's.",[536,865,867],{"id":866},"what-sends-a-notification","What sends a notification",[526,869,870],{},"Settings offers three events, and nothing that reports progress.",[569,872,873,886],{},[572,874,875],{},[575,876,877,880,883],{},[578,878,879],{},"Event",[578,881,882],{},"When",[578,884,885],{},"A browser alert says",[587,887,888,907,927],{},[575,889,890,895,903],{},[592,891,892],{},[554,893,894],{},"gate_requested",[592,896,897,898,902],{},"A ",[530,899,901],{"href":900},"\u002Fconcepts\u002Fvocabulary#gate","gate"," waits for your decision.",[592,904,905],{},[554,906,829],{},[575,908,909,914,922],{},[592,910,911],{},[554,912,913],{},"work_item_needs_human",[592,915,916,917,921],{},"An item stopped and waits for you, for one of the nine kinds in the first ",[530,918,920],{"href":919},"\u002Freference\u002Fevents#stop-kinds","Stop kinds"," table.",[592,923,924],{},[554,925,926],{},"stopped — gate wait or cap breach",[575,928,929,934,940],{},[592,930,931],{},[554,932,933],{},"work_item_storage_held",[592,935,936,937,549],{},"A start was queued because worktrees are over ",[554,938,939],{},"storage.worktrees.limit",[592,941,942],{},[554,943,944],{},"held: worktrees over the storage limit",[526,946,947,948,951,952,954,955,957],{},"A browser that never chose its events alerts for all three. A webhook's ",[554,949,950],{},"events"," list in ",[554,953,338],{}," is explicit, so add ",[554,956,933],{}," to it to be told.",[526,959,960,961,963,964,846,967,970],{},"The alert's wording is fixed and does not name the kind: read the item for that. ",[554,962,901],{}," is the gate event above, and ",[554,965,966],{},"wait",[554,968,969],{},"rate_limit"," send nothing, because they come from the item's status and not from this event.",[526,972,973,974,977,978,981],{},"A webhook message carries the item's id, title, the event type, the gate for a gate event, and a link to the item. A stop looks like this, with the ",[554,975,976],{},"base_url"," from step 3 in ",[554,979,980],{},"url",":",[744,983,987],{"className":984,"code":985,"language":986,"meta":750,"style":750},"language-json shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","{\n  \"work_item_id\": \"3f9c1e0a7b2d4c58a1e6d94b0c7f2a83\",\n  \"title\": \"Fix the flaky login test\",\n  \"type\": \"work_item_needs_human\",\n  \"gate\": null,\n  \"url\": \"http:\u002F\u002F192.168.1.20:8765\u002Fwork-items\u002F3f9c1e0a7b2d4c58a1e6d94b0c7f2a83\"\n}\n","json",[554,988,989,996,1013,1026,1039,1053,1064],{"__ignoreMap":750},[754,990,992],{"class":757,"line":991},1,[754,993,995],{"class":994},"s7iLA","{\n",[754,997,999,1003,1006,1010],{"class":757,"line":998},2,[754,1000,1002],{"class":1001},"sb7M8","  \"work_item_id\"",[754,1004,1005],{"class":994},": ",[754,1007,1009],{"class":1008},"semJd","\"3f9c1e0a7b2d4c58a1e6d94b0c7f2a83\"",[754,1011,1012],{"class":994},",\n",[754,1014,1016,1019,1021,1024],{"class":757,"line":1015},3,[754,1017,1018],{"class":1001},"  \"title\"",[754,1020,1005],{"class":994},[754,1022,1023],{"class":1008},"\"Fix the flaky login test\"",[754,1025,1012],{"class":994},[754,1027,1029,1032,1034,1037],{"class":757,"line":1028},4,[754,1030,1031],{"class":1001},"  \"type\"",[754,1033,1005],{"class":994},[754,1035,1036],{"class":1008},"\"work_item_needs_human\"",[754,1038,1012],{"class":994},[754,1040,1042,1045,1047,1051],{"class":757,"line":1041},5,[754,1043,1044],{"class":1001},"  \"gate\"",[754,1046,1005],{"class":994},[754,1048,1050],{"class":1049},"ssYy9","null",[754,1052,1012],{"class":994},[754,1054,1056,1059,1061],{"class":757,"line":1055},6,[754,1057,1058],{"class":1001},"  \"url\"",[754,1060,1005],{"class":994},[754,1062,1063],{"class":1008},"\"http:\u002F\u002F192.168.1.20:8765\u002Fwork-items\u002F3f9c1e0a7b2d4c58a1e6d94b0c7f2a83\"\n",[754,1065,1067],{"class":757,"line":1066},7,[754,1068,1069],{"class":994},"}\n",[526,1071,1072,1073,1075,1076,1079,1080,1082],{},"A gate event has the same fields, with the gate's name in ",[554,1074,901],{},", such as ",[554,1077,1078],{},"spec_approval",". ",[530,1081,482],{"href":562}," has the gate body, and what a webhook does when a send fails or events come close together.",[526,1084,1085,1086,1088,1089,549],{},"A browser alert for that stop has the item's title as its title and ",[554,1087,926],{}," as its text. For a gate the text is ",[554,1090,829],{},[536,1092,1094],{"id":1093},"check-it-worked","Check it worked",[541,1096,1097,1136],{},[544,1098,1099,1102,1103,1105,1106,1109,1110,1113,1114,1117,1118,1120,1121,1124,1125,1127,1128,1131,1132,549],{},[643,1100,1101],{},"Webhook."," The line beside ",[643,1104,738],{}," reads ",[554,1107,1108],{},"last delivered"," with a status from ",[554,1111,1112],{},"200"," to ",[554,1115,1116],{},"299",", and the message arrives in the service. The next time an item reaches a gate, a ",[554,1119,556],{}," arrives whose ",[554,1122,1123],{},"title"," is the item's title and whose ",[554,1126,980],{}," opens the item. ",[554,1129,1130],{},"kraft view show ID"," names the same stop. A status outside that range is explained in ",[530,1133,1135],{"href":1134},"#if-nothing-arrives","If nothing arrives",[544,1137,1138,1102,1141,1105,1143,1146,1147,1149],{},[643,1139,1140],{},"This browser.",[643,1142,738],{},[554,1144,1145],{},"last shown",", and an alert titled ",[554,1148,825],{}," appears.",[536,1151,1135],{"id":1152},"if-nothing-arrives",[526,1154,1155,1156,1159,1160,549],{},"The texts are the desktop's. On a phone, the webhook's dimmed button says ",[554,1157,1158],{},"Turn on the webhook and set a URL first.",", and a failed test reads ",[554,1161,856],{},[569,1163,1164,1177],{},[572,1165,1166],{},[575,1167,1168,1171,1174],{},[578,1169,1170],{},"What you see",[578,1172,1173],{},"What it means",[578,1175,1176],{},"Fix",[587,1178,1179,1195,1211,1235,1248,1273,1294,1314,1342,1359],{},[575,1180,1181,1189,1192],{},[592,1182,1183,1185,1186],{},[643,1184,738],{}," is dimmed, with ",[554,1187,1188],{},"set a webhook URL first",[592,1190,1191],{},"No URL is stored.",[592,1193,1194],{},"Do steps 2 to 5 of the webhook tab.",[575,1196,1197,1204,1207],{},[592,1198,1199,1185,1201],{},[643,1200,738],{},[554,1202,1203],{},"set the channel active first",[592,1205,1206],{},"A URL is stored, but the switch is off.",[592,1208,714,1209,549],{},[643,1210,717],{},[575,1212,1213,1221,1227],{},[592,1214,1215,1218,1219],{},[554,1216,1217],{},"url must be an http or https URL",", or the same for ",[554,1220,976],{},[592,1222,1223,1224,549],{},"The address has another scheme, such as ",[554,1225,1226],{},"file:",[592,1228,1229,1230,664,1232,1234],{},"Use a full ",[554,1231,663],{},[554,1233,667],{}," address.",[575,1236,1237,1242,1245],{},[592,1238,1239],{},[554,1240,1241],{},"last attempt 1m ago, failed: ConnectError",[592,1243,1244],{},"Kraft could not reach the URL. The line names the kind of error, never the address.",[592,1246,1247],{},"Check the URL and that the server can reach the service.",[575,1249,1250,1255,1270],{},[592,1251,1252,1254],{},[554,1253,1108],{}," with a status that is not 2xx",[592,1256,1257,1258,1261,1262,1265,1266,1269],{},"The service answered, and did not take the message. The test says ",[554,1259,1260],{},"delivered",", and a toast says ",[554,1263,1264],{},"Test sent to the webhook",", for any answer, a redirect or a ",[554,1267,1268],{},"404"," included.",[592,1271,1272],{},"Read the status: the service did not accept the URL or the body. A service that wants its own format needs a receiver in between.",[575,1274,1275,1278,1281],{},[592,1276,1277],{},"The test works, but no message comes for an item",[592,1279,1280],{},"Kraft sends one message per item every 10 seconds, only for the events you chose, and never for events from while the server was down.",[592,1282,1283,1284,1286,1287,1290,1291,549],{},"Check ",[643,1285,728],{},". After a failed send, the item's timeline holds a ",[554,1288,1289],{},"notification_failed"," event: ",[554,1292,1293],{},"kraft view events ID --type notification_failed",[575,1295,1296,1302,1305],{},[592,1297,1298,1299,1301],{},"A hand edit of ",[554,1300,338],{}," changes nothing, though Settings shows it",[592,1303,1304],{},"A running server reads the file only when a setting is saved or at start, and Settings shows what is on disk meanwhile.",[592,1306,1307,1308,1079,1311,1313],{},"Change a setting that saves on its own, such as switching an event off and back on, or run ",[554,1309,1310],{},"kraft admin restart",[643,1312,700],{}," stays dimmed until you edit a field.",[575,1315,1316,1322,1333],{},[592,1317,1318,1319],{},"The log says ",[554,1320,1321],{},"notify.yaml: ... -- notifications disabled until it is fixed",[592,1323,1324,1325,1328,1329,1332],{},"Kraft could not use the file, so it sends nothing. The text before the dashes is ",[554,1326,1327],{},"not valid YAML",", ",[554,1330,1331],{},"cannot be read",", or a key and its problem, such as an unknown key or an unknown event type.",[592,1334,1335,1336,1079,1338,1341],{},"Settings cannot open or save a file it refuses. Edit the file by hand, fix or remove the bad name, then run ",[554,1337,1310],{},[530,1339,160],{"href":1340},"\u002Fguides\u002Frun\u002Flogs-and-disk-space#find-the-logs"," says where the log is.",[575,1343,1344,1350,1356],{},[592,1345,1346,1347,1349],{},"The browser's ",[643,1348,738],{}," is dimmed, with no hint",[592,1351,1352,1353,1355],{},"It works only while ",[643,1354,807],{}," is on and the browser allows notifications.",[592,1357,1358],{},"Do steps 2 and 3 of the browser tab. On a phone, only the permission is needed.",[575,1360,1361,1364,1367],{},[592,1362,1363],{},"No browser alert, though the test worked",[592,1365,1366],{},"Alerts show only while the Kraft tab is hidden, and only while it is open.",[592,1368,1369],{},"Switch to another tab or window, and leave the Kraft tab open.",[536,1371,1373],{"id":1372},"next-steps","Next steps",[541,1375,1376,1385,1390,1395],{},[544,1377,1378,1381,1382,1384],{},[530,1379,1380],{"href":562},"Notifications",": the JSON body, how a failed send is retried, and the ",[554,1383,1289],{}," event.",[544,1386,1387,1389],{},[530,1388,338],{"href":339},": every field, and the events a hand edit can add.",[544,1391,1392,1394],{},[530,1393,199],{"href":200},": what each stop means and how to get the item going again.",[544,1396,1397,1399],{},[530,1398,88],{"href":89},": the phone layout, if that is where the alerts go.",[1401,1402,1403],"style",{},"html pre.shiki code .s7iLA, html code.shiki .s7iLA{--shiki-light:#0E1116;--shiki-default:#0E1116;--shiki-dark:#F0F3F6}html pre.shiki code .sb7M8, html code.shiki .sb7M8{--shiki-light:#024C1A;--shiki-default:#024C1A;--shiki-dark:#72F088}html pre.shiki code .semJd, html code.shiki .semJd{--shiki-light:#032563;--shiki-default:#032563;--shiki-dark:#ADDCFF}html pre.shiki code .ssYy9, html code.shiki .ssYy9{--shiki-light:#023B95;--shiki-default:#023B95;--shiki-dark:#91CBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":750,"searchDepth":998,"depth":998,"links":1405},[1406,1407,1408,1409,1410,1411],{"id":538,"depth":998,"text":539},{"id":566,"depth":998,"text":567},{"id":866,"depth":998,"text":867},{"id":1093,"depth":998,"text":1094},{"id":1152,"depth":998,"text":1135},{"id":1372,"depth":998,"text":1373},"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.","md",null,{},true,{"title":92,"description":1412},"LO58dovqUl58TCkgow6unjdX8dyOFInUIvY5k1_Nfe4",[1420,1422],{"title":88,"path":89,"stem":90,"description":1421,"children":-1},"The phone layout, with its bottom bar, the board's filters and cards, and the buttons on a stopped item.",{"title":102,"path":103,"stem":104,"description":1423,"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.",1791801170650]