[{"data":1,"prerenderedAt":1672},["ShallowReactive",2],{"navigation_docs":3,"-reference-chain-nodes-result-file":504,"-reference-chain-nodes-result-file-surround":1667},[4,28,51,187,214,469],{"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,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},"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},"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},"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},"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},"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},"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},"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},"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},"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},"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},"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":390,"body":506,"description":1660,"extension":1661,"links":1662,"meta":1663,"navigation":1664,"path":391,"seo":1665,"stem":392,"__hash__":1666},"docs\u002F5.reference\u002F04.chain-nodes\u002F4.result-file.md",{"type":507,"value":508,"toc":1647},"minimark",[509,526,531,582,586,589,735,742,787,790,824,828,831,1035,1038,1146,1161,1165,1167,1170,1284,1295,1316,1318,1403,1411,1413,1421,1468,1494,1510,1527,1538,1540,1543,1620,1624,1643],[510,511,512,513,517,518,521,522,525],"p",{},"Every agent and subprocess task gets ",[514,515,516],"code",{},"KRAFT_RESULT_PATH"," in its environment:\nthe path of a JSON file it writes before it exits. Kraft reads the task's\nstatus, findings, verdict, and usage back from it. The file is\n",[514,519,520],{},"run\u002Fresults\u002F\u003Csession id>.json"," under ",[514,523,524],{},"$KRAFT_HOME",", and it stays after the\nsession ends.",[527,528,530],"h2",{"id":529},"who-must-write-it","Who must write it",[532,533,534,546,573],"ul",{},[535,536,537,541,542,545],"li",{},[538,539,540],"strong",{},"An agent task must."," Kraft's instructions to every agent say what to\nwrite. An agent that exits cleanly without a result file ends ",[514,543,544],{},"failed",".",[535,547,548,551,552,557,558,560,561,564,565,568,569,572],{},[538,549,550],{},"An agent's turn must not leave a background job running."," For a ",[553,554,556],"a",{"href":555},"\u002Fconcepts\u002Fvocabulary#harness","harness"," that\ndeclares a log format, a turn that ends with one ends the task ",[514,559,544],{},", even\nwhen the file says ",[514,562,563],{},"done",". A ",[514,566,567],{},"needs_context"," stop keeps its status. The last\nline of the session log and a ",[514,570,571],{},"background_jobs_abandoned"," event name each job.",[535,574,575,578,579,545],{},[538,576,577],{},"A subprocess task may."," Without one, its exit code decides. See\n",[553,580,382],{"href":581},"\u002Freference\u002Fchain-nodes\u002Fsubprocess-tasks#how-the-status-is-decided",[527,583,585],{"id":584},"examples","Examples",[510,587,588],{},"A review that found one problem:",[590,591,597],"pre",{"className":592,"code":593,"filename":594,"language":595,"meta":596,"style":596},"language-json shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","{\n  \"status\": \"done\",\n  \"session_summary_ref\": \".engineering\u002Fsessions\u002F2c1f.md\",\n  \"findings\": [\n    {\n      \"severity\": \"important\",\n      \"message\": \"The retry loop never backs off, so a down server gets hammered.\",\n      \"file\": \"src\u002Fclient.py\",\n      \"line\": 42,\n      \"source_plugin\": \"code-review\"\n    }\n  ]\n}\n","$KRAFT_RESULT_PATH","json","",[514,598,599,608,625,638,647,653,666,679,692,706,717,723,729],{"__ignoreMap":596},[600,601,604],"span",{"class":602,"line":603},"line",1,[600,605,607],{"class":606},"s7iLA","{\n",[600,609,611,615,618,622],{"class":602,"line":610},2,[600,612,614],{"class":613},"sb7M8","  \"status\"",[600,616,617],{"class":606},": ",[600,619,621],{"class":620},"semJd","\"done\"",[600,623,624],{"class":606},",\n",[600,626,628,631,633,636],{"class":602,"line":627},3,[600,629,630],{"class":613},"  \"session_summary_ref\"",[600,632,617],{"class":606},[600,634,635],{"class":620},"\".engineering\u002Fsessions\u002F2c1f.md\"",[600,637,624],{"class":606},[600,639,641,644],{"class":602,"line":640},4,[600,642,643],{"class":613},"  \"findings\"",[600,645,646],{"class":606},": [\n",[600,648,650],{"class":602,"line":649},5,[600,651,652],{"class":606},"    {\n",[600,654,656,659,661,664],{"class":602,"line":655},6,[600,657,658],{"class":613},"      \"severity\"",[600,660,617],{"class":606},[600,662,663],{"class":620},"\"important\"",[600,665,624],{"class":606},[600,667,669,672,674,677],{"class":602,"line":668},7,[600,670,671],{"class":613},"      \"message\"",[600,673,617],{"class":606},[600,675,676],{"class":620},"\"The retry loop never backs off, so a down server gets hammered.\"",[600,678,624],{"class":606},[600,680,682,685,687,690],{"class":602,"line":681},8,[600,683,684],{"class":613},"      \"file\"",[600,686,617],{"class":606},[600,688,689],{"class":620},"\"src\u002Fclient.py\"",[600,691,624],{"class":606},[600,693,695,698,700,704],{"class":602,"line":694},9,[600,696,697],{"class":613},"      \"line\"",[600,699,617],{"class":606},[600,701,703],{"class":702},"ssYy9","42",[600,705,624],{"class":606},[600,707,709,712,714],{"class":602,"line":708},10,[600,710,711],{"class":613},"      \"source_plugin\"",[600,713,617],{"class":606},[600,715,716],{"class":620},"\"code-review\"\n",[600,718,720],{"class":602,"line":719},11,[600,721,722],{"class":606},"    }\n",[600,724,726],{"class":602,"line":725},12,[600,727,728],{"class":606},"  ]\n",[600,730,732],{"class":602,"line":731},13,[600,733,734],{"class":606},"}\n",[510,736,737,738,741],{},"A fix-loop judge's ruling, with its reasoning in ",[514,739,740],{},"concerns",":",[590,743,745],{"className":592,"code":744,"filename":594,"language":595,"meta":596,"style":596},"{\n  \"status\": \"done\",\n  \"verdict\": \"stop_needs_human\",\n  \"concerns\": \"The same two findings came back after three repairs.\"\n}\n",[514,746,747,751,761,773,783],{"__ignoreMap":596},[600,748,749],{"class":602,"line":603},[600,750,607],{"class":606},[600,752,753,755,757,759],{"class":602,"line":610},[600,754,614],{"class":613},[600,756,617],{"class":606},[600,758,621],{"class":620},[600,760,624],{"class":606},[600,762,763,766,768,771],{"class":602,"line":627},[600,764,765],{"class":613},"  \"verdict\"",[600,767,617],{"class":606},[600,769,770],{"class":620},"\"stop_needs_human\"",[600,772,624],{"class":606},[600,774,775,778,780],{"class":602,"line":640},[600,776,777],{"class":613},"  \"concerns\"",[600,779,617],{"class":606},[600,781,782],{"class":620},"\"The same two findings came back after three repairs.\"\n",[600,784,785],{"class":602,"line":649},[600,786,734],{"class":606},[510,788,789],{},"A task that cannot go on without an answer:",[590,791,793],{"className":592,"code":792,"filename":594,"language":595,"meta":596,"style":596},"{\n  \"status\": \"needs_context\",\n  \"question\": \"Which of the two config loaders should the new key go through?\"\n}\n",[514,794,795,799,810,820],{"__ignoreMap":596},[600,796,797],{"class":602,"line":603},[600,798,607],{"class":606},[600,800,801,803,805,808],{"class":602,"line":610},[600,802,614],{"class":613},[600,804,617],{"class":606},[600,806,807],{"class":620},"\"needs_context\"",[600,809,624],{"class":606},[600,811,812,815,817],{"class":602,"line":627},[600,813,814],{"class":613},"  \"question\"",[600,816,617],{"class":606},[600,818,819],{"class":620},"\"Which of the two config loaders should the new key go through?\"\n",[600,821,822],{"class":602,"line":640},[600,823,734],{"class":606},[527,825,827],{"id":826},"fields","Fields",[510,829,830],{},"The file is one JSON object. Kraft ignores keys it does not know.",[832,833,834,853],"table",{},[835,836,837],"thead",{},[838,839,840,844,847,850],"tr",{},[841,842,843],"th",{},"Field",[841,845,846],{},"Type",[841,848,849],{},"Read from",[841,851,852],{},"Meaning",[854,855,856,876,898,914,928,947,968,987,1004,1021],"tbody",{},[838,857,858,864,867,870],{},[859,860,861],"td",{},[514,862,863],{},"status",[859,865,866],{},"string",[859,868,869],{},"every task",[859,871,872,873,545],{},"How the task went. See ",[553,874,863],{"href":875},"#status",[838,877,878,882,884,886],{},[859,879,880],{},[514,881,740],{},[859,883,866],{},[859,885,869],{},[859,887,888,889,892,893,897],{},"With ",[514,890,891],{},"done_with_concerns",", why. From a ",[553,894,896],{"href":895},"\u002Fconcepts\u002Fvocabulary#judge","judge"," or a gate review, the reasoning.",[838,899,900,905,907,909],{},[859,901,902],{},[514,903,904],{},"question",[859,906,866],{},[859,908,869],{},[859,910,888,911,913],{},[514,912,567],{},", what the task needs to know. The item stops with it.",[838,915,916,921,923,925],{},[859,917,918],{},[514,919,920],{},"session_summary_ref",[859,922,866],{},[859,924,869],{},[859,926,927],{},"The session summary's path, relative to the repo root.",[838,929,930,935,938,941],{},[859,931,932],{},[514,933,934],{},"findings",[859,936,937],{},"array",[859,939,940],{},"measuring tasks",[859,942,943,944,545],{},"What a review or check found. See ",[553,945,934],{"href":946},"#findings",[838,948,949,954,956,962],{},[859,950,951],{},[514,952,953],{},"verdict",[859,955,866],{},[859,957,958,959],{},"a fix-loop judge, a gate's ",[514,960,961],{},"auto_review",[859,963,964,965,545],{},"See ",[553,966,953],{"href":967},"#verdict",[838,969,970,975,978,981],{},[859,971,972],{},[514,973,974],{},"suggested_action",[859,976,977],{},"object",[859,979,980],{},"the last task a node ran before it stopped",[859,982,983,984,545],{},"What a person should do next. See ",[553,985,974],{"href":986},"#suggested_action",[838,988,989,994,996,998],{},[859,990,991],{},[514,992,993],{},"usage",[859,995,977],{},[859,997,869],{},[859,999,1000,1001,545],{},"Token counts. See ",[553,1002,993],{"href":1003},"#usage",[838,1005,1006,1011,1014,1016],{},[859,1007,1008],{},[514,1009,1010],{},"cost_usd",[859,1012,1013],{},"number",[859,1015,869],{},[859,1017,1018,1019,545],{},"What the session cost. See ",[553,1020,993],{"href":1003},[838,1022,1023,1028,1030,1032],{},[859,1024,1025],{},[514,1026,1027],{},"model",[859,1029,866],{},[859,1031,869],{},[859,1033,1034],{},"The model that did the work.",[1036,1037,863],"h3",{"id":863},[832,1039,1040,1052],{},[835,1041,1042],{},[838,1043,1044,1047,1050],{},[841,1045,1046],{},"Value",[841,1048,1049],{},"Set by",[841,1051,852],{},[854,1053,1054,1066,1084,1095,1109,1122,1134],{},[838,1055,1056,1060,1063],{},[859,1057,1058],{},[514,1059,563],{},[859,1061,1062],{},"The task",[859,1064,1065],{},"The task finished.",[838,1067,1068,1072,1074],{},[859,1069,1070],{},[514,1071,891],{},[859,1073,1062],{},[859,1075,1076,1077,1079,1080,1083],{},"The task finished but doubts the result; ",[514,1078,740],{}," says why. The node goes on. A repair in an ",[514,1081,1082],{},"on_failure"," recovery that ends this way stops the item and waits for you.",[838,1085,1086,1090,1092],{},[859,1087,1088],{},[514,1089,544],{},[859,1091,1062],{},[859,1093,1094],{},"The task could not finish.",[838,1096,1097,1101,1103],{},[859,1098,1099],{},[514,1100,567],{},[859,1102,1062],{},[859,1104,1105,1106,1108],{},"The task is missing information; ",[514,1107,904],{}," says what. The item stops and waits for you, with the question.",[838,1110,1111,1116,1119],{},[859,1112,1113],{},[514,1114,1115],{},"config_error",[859,1117,1118],{},"Kraft",[859,1120,1121],{},"The task could not run as configured, for example a command that does not exist.",[838,1123,1124,1129,1131],{},[859,1125,1126],{},[514,1127,1128],{},"capped_out",[859,1130,1118],{},[859,1132,1133],{},"A cap or a wait ran out.",[838,1135,1136,1141,1143],{},[859,1137,1138],{},[514,1139,1140],{},"paused",[859,1142,1118],{},[859,1144,1145],{},"You paused the item.",[510,1147,1148,1149,1151,1152,1154,1155,1157,1158,545],{},"A task never writes the three Kraft statuses. A file that is not valid JSON, is\nnot UTF-8, has no ",[514,1150,863],{},", or has a ",[514,1153,863],{}," that is not one of the four task\nvalues ends the task ",[514,1156,544],{},", and that includes a file that names a Kraft\nstatus. An empty file counts as no file. See\n",[553,1159,1160],{"href":581},"how the status is decided",[1162,1163,1164],"note",{},"A task that needs an answer should ask for everything at once: each question\ncosts a new run.",[1036,1166,934],{"id":934},[510,1168,1169],{},"Each entry is an object:",[832,1171,1172,1184],{},[835,1173,1174],{},[838,1175,1176,1179,1182],{},[841,1177,1178],{},"Key",[841,1180,1181],{},"Required",[841,1183,852],{},[854,1185,1186,1221,1233,1248,1261,1272],{},[838,1187,1188,1193,1196],{},[859,1189,1190],{},[514,1191,1192],{},"severity",[859,1194,1195],{},"yes",[859,1197,1198,1201,1202,1205,1206,1209,1210,1214,1215,1218,1219,545],{},[514,1199,1200],{},"critical",", ",[514,1203,1204],{},"important"," or ",[514,1207,1208],{},"minor",". Which ones open a ",[553,1211,1213],{"href":1212},"\u002Fconcepts\u002Fvocabulary#fix-loop","fix loop"," is ",[514,1216,1217],{},"findings.loop_severities"," in ",[553,1220,310],{"href":311},[838,1222,1223,1228,1230],{},[859,1224,1225],{},[514,1226,1227],{},"message",[859,1229,1195],{},[859,1231,1232],{},"What is wrong and why.",[838,1234,1235,1240,1242],{},[859,1236,1237],{},[514,1238,1239],{},"source_plugin",[859,1241,1195],{},[859,1243,1244,1245,545],{},"Who found it, such as ",[514,1246,1247],{},"code-review",[838,1249,1250,1255,1258],{},[859,1251,1252],{},[514,1253,1254],{},"file",[859,1256,1257],{},"no",[859,1259,1260],{},"The path, relative to the repo root.",[838,1262,1263,1267,1269],{},[859,1264,1265],{},[514,1266,602],{},[859,1268,1257],{},[859,1270,1271],{},"An integer. Not part of the finding's identity, so an approximate line is fine.",[838,1273,1274,1279,1281],{},[859,1275,1276],{},[514,1277,1278],{},"same_as",[859,1280,1257],{},[859,1282,1283],{},"The 16-character tag of a finding from an earlier round that this one restates. Only a tag the task was shown counts; any other is ignored.",[510,1285,1286,1287,1290,1291,1294],{},"An entry missing a required key, or with an unknown severity, is dropped. The\n",[514,1288,1289],{},"findings_measured"," event counts dropped entries under ",[514,1292,1293],{},"dropped",", per task.",[510,1296,1297,1298,1300,1301,1201,1303,1305,1306,1308,1309,1313,1314,545],{},"A finding's identity across rounds is its ",[514,1299,1278],{},", or else a hash of\n",[514,1302,1239],{},[514,1304,1254],{}," and ",[514,1307,1227],{},". The fix loop's ",[553,1310,1312],{"href":1311},"\u002Fconcepts\u002Fvocabulary#stuck","stuck"," check and the\njudge's history read it. See ",[553,1315,386],{"href":387},[1036,1317,953],{"id":953},[832,1319,1320,1333],{},[835,1321,1322],{},[838,1323,1324,1327,1330],{},[841,1325,1326],{},"Written by",[841,1328,1329],{},"Values",[841,1331,1332],{},"Anything else",[854,1334,1335,1362],{},[838,1336,1337,1342,1358],{},[859,1338,1339,1340],{},"A fix loop's ",[514,1341,896],{},[859,1343,1344,1201,1347,1201,1350,1353,1354,545],{},[514,1345,1346],{},"continue",[514,1348,1349],{},"stop_needs_human",[514,1351,1352],{},"stop_downgrade",". See ",[553,1355,1357],{"href":1356},"\u002Freference\u002Fchain-nodes\u002Ffix-loop#the-judge","The judge",[859,1359,1360],{},[514,1361,1346],{},[838,1363,1364,1369,1398],{},[859,1365,1366,1367],{},"A gate's ",[514,1368,961],{},[859,1370,1371,1201,1374,1201,1377,1380,1381,1385,1386,1389,1390,1305,1392,1394,1395,1397],{},[514,1372,1373],{},"approve",[514,1375,1376],{},"reject",[514,1378,1379],{},"fixed"," (it repaired the ",[553,1382,1384],{"href":1383},"\u002Fconcepts\u002Fvocabulary#worktree","worktree"," and the node runs again), ",[514,1387,1388],{},"undecided",". ",[514,1391,1376],{},[514,1393,1379],{}," need ",[514,1396,740],{},", which becomes the steer for the re-run.",[859,1399,1400,1402],{},[514,1401,1388],{},": the gate waits for you",[510,1404,1405,1406,1205,1408,1410],{},"A verdict from a task that ended ",[514,1407,544],{},[514,1409,567],{}," does not count,\nwhatever it says: Kraft reads it as the \"Anything else\" value in the table.",[1036,1412,974],{"id":974},[510,1414,1415,1416,1418,1419,741],{},"A recovery that concludes no repair can help ends ",[514,1417,544],{}," and writes a\n",[514,1420,974],{},[590,1422,1424],{"className":592,"code":1423,"filename":594,"language":595,"meta":596,"style":596},"{\"status\": \"failed\", \"suggested_action\": {\"action\": \"retry\", \"reason\": \"the registry was down\"}}\n",[514,1425,1426],{"__ignoreMap":596},[600,1427,1428,1431,1434,1436,1439,1441,1444,1447,1450,1452,1455,1457,1460,1462,1465],{"class":602,"line":603},[600,1429,1430],{"class":606},"{",[600,1432,1433],{"class":613},"\"status\"",[600,1435,617],{"class":606},[600,1437,1438],{"class":620},"\"failed\"",[600,1440,1201],{"class":606},[600,1442,1443],{"class":613},"\"suggested_action\"",[600,1445,1446],{"class":606},": {",[600,1448,1449],{"class":613},"\"action\"",[600,1451,617],{"class":606},[600,1453,1454],{"class":620},"\"retry\"",[600,1456,1201],{"class":606},[600,1458,1459],{"class":613},"\"reason\"",[600,1461,617],{"class":606},[600,1463,1464],{"class":620},"\"the registry was down\"",[600,1466,1467],{"class":606},"}}\n",[510,1469,1470,1214,1473,1201,1476,1205,1479,1482,1483,1486,1487,1489,1490,1493],{},[514,1471,1472],{},"action",[514,1474,1475],{},"skip",[514,1477,1478],{},"retry",[514,1480,1481],{},"abandon",", and ",[514,1484,1485],{},"reason"," is one sentence. Any other\n",[514,1488,1472],{}," is ignored. When the item stops, ",[514,1491,1492],{},"kraft view show"," prints the reason and\nthe one command that takes the action, in this form:",[590,1495,1500],{"className":1496,"code":1498,"language":1499,"meta":596},[1497],"language-text","retry: \u003Creason>\nrun: kraft item retry \u003CID>\n","text",[514,1501,1502,1506],{"__ignoreMap":596},[600,1503,1505],{"className":1504},[602],"retry: \u003Creason>\n",[600,1507,1509],{"className":1508},[602],"run: kraft item retry \u003CID>\n",[510,1511,1512,1513,1201,1516,1519,1520,1523,1524,1526],{},"The command is ",[514,1514,1515],{},"kraft item skip ID",[514,1517,1518],{},"kraft item retry ID",", or\n",[514,1521,1522],{},"kraft item abandon --yes ID",". With no ",[514,1525,1485],{},", the first line is the action\nalone.",[510,1528,1529,1530,1532,1533,1537],{},"A stop caused by infrastructure always suggests ",[514,1531,1478],{},", with no recovery involved.\nInfrastructure here means a CI pipeline that failed for the ",[553,1534,1536],{"href":1535},"\u002Fconcepts\u002Fvocabulary#forge","forge","'s own reasons,\nan automated reviewer that errored, or a cancelled run with no successor coming.",[1036,1539,993],{"id":993},[510,1541,1542],{},"Kraft reads a session's tokens and cost from the result file first, and from\nthe agent's log after that when the harness declares a log format. A harness\nthat reports usage only through the result file is asked to write it there.",[832,1544,1545,1553],{},[835,1546,1547],{},[838,1548,1549,1551],{},[841,1550,1178],{},[841,1552,852],{},[854,1554,1555,1565,1575,1585,1595,1611],{},[838,1556,1557,1562],{},[859,1558,1559],{},[514,1560,1561],{},"usage.input_tokens",[859,1563,1564],{},"Input tokens used.",[838,1566,1567,1572],{},[859,1568,1569],{},[514,1570,1571],{},"usage.output_tokens",[859,1573,1574],{},"Output tokens used.",[838,1576,1577,1582],{},[859,1578,1579],{},[514,1580,1581],{},"usage.cache_creation_input_tokens",[859,1583,1584],{},"Cache-write tokens, counted as billed input.",[838,1586,1587,1592],{},[859,1588,1589],{},[514,1590,1591],{},"usage.cache_read_input_tokens",[859,1593,1594],{},"Cache-read tokens, counted as billed input.",[838,1596,1597,1601],{},[859,1598,1599],{},[514,1600,1010],{},[859,1602,1603,1604,1606,1607,1610],{},"What the session cost, at the top level of the file, not inside ",[514,1605,993],{},". Also read as ",[514,1608,1609],{},"total_cost_usd",". Leave it out when you do not know it, rather than guess.",[838,1612,1613,1617],{},[859,1614,1615],{},[514,1616,1027],{},[859,1618,1619],{},"The model that did the work, at the top level of the file.",[527,1621,1623],{"id":1622},"related","Related",[532,1625,1626,1631,1636],{},[535,1627,1628,1630],{},[553,1629,382],{"href":383},": how a command's exit code and result file become a status.",[535,1632,1633,1635],{},[553,1634,386],{"href":387},": how findings and a judge's verdict drive the loop.",[535,1637,1638,617,1640,1642],{},[553,1639,466],{"href":467},[514,1641,1289],{}," and the other events a result file produces.",[1644,1645,1646],"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":596,"searchDepth":610,"depth":610,"links":1648},[1649,1650,1651,1659],{"id":529,"depth":610,"text":530},{"id":584,"depth":610,"text":585},{"id":826,"depth":610,"text":827,"children":1652},[1653,1654,1655,1656,1658],{"id":863,"depth":627,"text":863},{"id":934,"depth":627,"text":934},{"id":953,"depth":627,"text":953},{"id":974,"depth":627,"text":1657},"suggested_​action",{"id":993,"depth":627,"text":993},{"id":1622,"depth":610,"text":1623},"The JSON file a task writes at $KRAFT_RESULT_PATH, and every field Kraft reads from it.","md",null,{},true,{"title":390,"description":1660},"XoN31dEi86ewQdnd8q-l0t2Rdz8odSq3l5lryXdCbek",[1668,1670],{"title":386,"path":387,"stem":388,"description":1669,"children":-1},"When a node's fix loop opens, what its repair tasks are told, when the judge runs, and what each verdict does.",{"title":10,"path":395,"stem":396,"description":1671,"children":-1},"Which agent CLIs Kraft runs, what each supports, and how a task picks one.",1791801258095]