[{"data":1,"prerenderedAt":2316},["ShallowReactive",2],{"navigation_docs":3,"-project-source-map":504,"-project-source-map-surround":2311},[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":497,"body":506,"description":2304,"extension":2305,"links":2306,"meta":2307,"navigation":2308,"path":498,"seo":2309,"stem":499,"__hash__":2310},"docs\u002F6.project\u002F6.source-map.md",{"type":507,"value":508,"toc":2288},"minimark",[509,522,527,532,537,835,839,1161,1165,1277,1281,1500,1504,1620,1624,1844,1869,1873,1895,1967,1970,2000,2004,2272,2276],[510,511,512,513,517,518,521],"p",{},"This page is for contributors. It lists what each part of ",[514,515,516],"code",{},"src\u002Fkraft\u002F"," holds, and\nwhere to make each kind of change. For how those parts fit together, see\n",[519,520,493],"a",{"href":494},".",[523,524,526],"h2",{"id":525},"module-map","Module map",[510,528,529,530,521],{},"Every path below is under ",[514,531,516],{},[533,534,536],"h3",{"id":535},"serving","Serving",[538,539,540,553],"table",{},[541,542,543],"thead",{},[544,545,546,550],"tr",{},[547,548,549],"th",{},"Path",[547,551,552],{},"What it does",[554,555,556,593,619,634,644,654,672,682,698,752,762,772,782,792,802,815,825],"tbody",{},[544,557,558,564],{},[559,560,561],"td",{},[514,562,563],{},"cli\u002F",[559,565,566,567,570,571,574,575,574,578,581,582,585,586,589,590,521],{},"The ",[514,568,569],{},"kraft"," command: ",[514,572,573],{},"item",", ",[514,576,577],{},"view",[514,579,580],{},"repo"," and ",[514,583,584],{},"admin"," verb groups, and starting the server. ",[514,587,588],{},"cli\u002Fverify.py"," is ",[514,591,592],{},"kraft repo connect --verify",[544,594,595,600],{},[559,596,597],{},[514,598,599],{},"client\u002F",[559,601,602,603,606,607,610,611,614,615,618],{},"The one HTTP client. ",[514,604,605],{},"transport.py"," is the wire, ",[514,608,609],{},"actions.py"," changes things, ",[514,612,613],{},"reads.py"," reads, ",[514,616,617],{},"context.py"," knows which item a worker stands in.",[544,620,621,626],{},[559,622,623],{},[514,624,625],{},"mcp.py",[559,627,628,631,632,521],{},[514,629,630],{},"kraft admin mcp",": the MCP tools, each a call into ",[514,633,599],{},[544,635,636,641],{},[559,637,638],{},[514,639,640],{},"api\u002F__init__.py",[559,642,643],{},"Builds the FastAPI app, installs middleware, serves the SPA.",[544,645,646,651],{},[559,647,648],{},[514,649,650],{},"api\u002Fstartup.py",[559,652,653],{},"The lifespan: opens the database, reattaches sessions, starts the pollers.",[544,655,656,661],{},[559,657,658],{},[514,659,660],{},"api\u002Fdeps.py",[559,662,663,664,667,668,521],{},"Helpers shared by routes, including ",[514,665,666],{},"spawn",", which starts a ",[519,669,671],{"href":670},"\u002Fconcepts\u002Fvocabulary#walk","walk",[544,673,674,679],{},[559,675,676],{},[514,677,678],{},"api\u002Fperimeter.py",[559,680,681],{},"Who may call the API at all.",[544,683,684,689],{},[559,685,686],{},[514,687,688],{},"api\u002Fapidocs.py",[559,690,566,691,581,694,697],{},[514,692,693],{},"\u002Fdocs",[514,695,696],{},"\u002Fredoc"," pages, with their scripts pinned to one release and checked by hash.",[544,699,700,705],{},[559,701,702],{},[514,703,704],{},"api\u002Froutes\u002F",[559,706,707,708,574,711,574,714,574,717,574,720,574,723,574,726,574,729,574,732,574,735,574,738,574,741,574,744,574,747,574,749,521],{},"One module per resource: ",[514,709,710],{},"work_items",[514,712,713],{},"lifecycle",[514,715,716],{},"gates",[514,718,719],{},"review",[514,721,722],{},"board",[514,724,725],{},"artifacts",[514,727,728],{},"sessions",[514,730,731],{},"repos",[514,733,734],{},"settings",[514,736,737],{},"harnesses",[514,739,740],{},"search",[514,742,743],{},"auth",[514,745,746],{},"check",[514,748,584],{},[514,750,751],{},"drafts",[544,753,754,759],{},[559,755,756],{},[514,757,758],{},"api\u002Froutes\u002Flifecycle.py",[559,760,761],{},"Pause, resume, retry, skip, abandon, complete, cancel, escalate.",[544,763,764,769],{},[559,765,766],{},[514,767,768],{},"api\u002Froutes\u002Fsessions.py",[559,770,771],{},"Logs, permission requests, the WebSocket.",[544,773,774,779],{},[559,775,776],{},[514,777,778],{},"api\u002Froutes\u002Fadmin.py",[559,780,781],{},"Pending changes, restart, update.",[544,783,784,789],{},[559,785,786],{},[514,787,788],{},"api\u002Froutes\u002Fdrafts.py",[559,790,791],{},"The Templates editor's unpublished edits.",[544,793,794,799],{},[559,795,796],{},[514,797,798],{},"api\u002Fconfig_check.py",[559,800,801],{},"Checks a config file the way saving it would.",[544,803,804,812],{},[559,805,806,574,809],{},[514,807,808],{},"drafts\u002F",[514,810,811],{},"apply.py",[559,813,814],{},"Unpublished config and item-chain edits kept server-side, and what is saved but not yet running (reload and restart items).",[544,816,817,822],{},[559,818,819],{},[514,820,821],{},"ws.py",[559,823,824],{},"Fans committed events out to WebSocket clients.",[544,826,827,832],{},[559,828,829],{},[514,830,831],{},"render.py",[559,833,834],{},"Terminal formatting for the CLI.",[533,836,838],{"id":837},"running-a-chain","Running a chain",[538,840,841,849],{},[541,842,843],{},[544,844,845,847],{},[547,846,549],{},[547,848,552],{},[554,850,851,861,876,886,901,915,925,941,951,965,979,993,1008,1018,1032,1047,1060,1073,1083,1097,1107,1117,1127,1137,1147],{},[544,852,853,858],{},[559,854,855],{},[514,856,857],{},"executor\u002Fentry.py",[559,859,860],{},"Intake, attachments, and closing an item's issues in beads when it completes.",[544,862,863,868],{},[559,864,865],{},[514,866,867],{},"executor\u002Fwalk.py",[559,869,870,871,875],{},"The walk: node by node, with recovery, the ",[519,872,874],{"href":873},"\u002Fconcepts\u002Fvocabulary#fix-loop","fix loop",", escalation and every stop.",[544,877,878,883],{},[559,879,880],{},[514,881,882],{},"executor\u002Fdispatch.py",[559,884,885],{},"Runs a node's steps and tasks, measures the result, collects findings, and asks the fix-loop judge.",[544,887,888,893],{},[559,889,890],{},[514,891,892],{},"executor\u002Fgates.py",[559,894,895,896,900],{},"Opening gates, approval and rejection, agent gate review, and automatic escalation of ",[519,897,899],{"href":898},"\u002Fconcepts\u002Fvocabulary#stuck","stuck"," stops.",[544,902,903,908],{},[559,904,905],{},[514,906,907],{},"executor\u002Fstops.py",[559,909,910,911,914],{},"Writes each kind of stop, and guards every claim so an ",[514,912,913],{},"active"," item always has a walk behind it.",[544,916,917,922],{},[559,918,919],{},[514,920,921],{},"executor\u002Fresuming.py",[559,923,924],{},"Resuming after a restart, and addressing a steer to paused tasks.",[544,926,927,938],{},[559,928,929,574,932,574,935],{},[514,930,931],{},"executor\u002Fretry.py",[514,933,934],{},"store\u002Fforks.py",[514,936,937],{},"templates\u002Fforks.py",[559,939,940],{},"A retry forks the run at a task, step or node path.",[544,942,943,948],{},[559,944,945],{},[514,946,947],{},"executor\u002Fprompts.py",[559,949,950],{},"The text Kraft adds to an agent's prompt: steers, failures, findings, review threads, progress.",[544,952,953,958],{},[559,954,955],{},[514,956,957],{},"executor\u002Fcontext.py",[559,959,960,961,964],{},"Walk results and the ",[514,962,963],{},"Steer"," object.",[544,966,967,972],{},[559,968,969],{},[514,970,971],{},"executor\u002Ffallback.py",[559,973,974,975,978],{},"Moving a rate-limited or unavailable agent task to its next ",[514,976,977],{},"fallback:"," entry.",[544,980,981,986],{},[559,982,983],{},[514,984,985],{},"executor\u002Fread_only.py",[559,987,988,989,992],{},"Checks that a ",[514,990,991],{},"read_only"," step changed nothing.",[544,994,995,1000],{},[559,996,997],{},[514,998,999],{},"builtins.py",[559,1001,1002,1003,1007],{},"Work Kraft does itself: the ",[519,1004,1006],{"href":1005},"\u002Fconcepts\u002Fvocabulary#worktree","worktree",", setup, rebases, changed-test scopes.",[544,1009,1010,1015],{},[559,1011,1012],{},[514,1013,1014],{},"waits.py",[559,1016,1017],{},"External waits and the scheduler that re-enters them.",[544,1019,1020,1025],{},[559,1021,1022],{},[514,1023,1024],{},"rate_limit_retry.py",[559,1026,1027,1028,1031],{},"Re-enters a ",[514,1029,1030],{},"rate_limited"," item after its reset.",[544,1033,1034,1039],{},[559,1035,1036],{},[514,1037,1038],{},"mr_poller.py",[559,1040,1041,1042,1046],{},"Notices a merge request closed on the ",[519,1043,1045],{"href":1044},"\u002Fconcepts\u002Fvocabulary#forge","forge"," without merging.",[544,1048,1049,1057],{},[559,1050,1051,574,1054],{},[514,1052,1053],{},"caps.py",[514,1055,1056],{},"cap_levels.py",[559,1058,1059],{},"Time caps per scope, and the poller that stops parked items.",[544,1061,1062,1067],{},[559,1063,1064],{},[514,1065,1066],{},"policy.py",[559,1068,1069,1070,1072],{},"Loads ",[514,1071,310],{},": loops, caps, budget, concurrency, escalation settings.",[544,1074,1075,1080],{},[559,1076,1077],{},[514,1078,1079],{},"findings.py",[559,1081,1082],{},"The finding schema reviewers report, and its identity across rounds.",[544,1084,1085,1090],{},[559,1086,1087],{},[514,1088,1089],{},"escalate.py",[559,1091,1092,1096],{},[519,1093,1095],{"href":1094},"\u002Fconcepts\u002Fvocabulary#escalation-turn","Escalation turns",": the agent a stopped item hands to.",[544,1098,1099,1104],{},[559,1100,1101],{},[514,1102,1103],{},"auto_escalate_delay.py",[559,1105,1106],{},"Fires a delayed automatic escalation.",[544,1108,1109,1114],{},[559,1110,1111],{},[514,1112,1113],{},"gate_review.py",[559,1115,1116],{},"An agent reviewing a gate before a person sees it.",[544,1118,1119,1124],{},[559,1120,1121],{},[514,1122,1123],{},"review.py",[559,1125,1126],{},"The one producer of \"what changed\" for the gate viewer and review agents.",[544,1128,1129,1134],{},[559,1130,1131],{},[514,1132,1133],{},"review_reply.py",[559,1135,1136],{},"The agent that answers review threads.",[544,1138,1139,1144],{},[559,1140,1141],{},[514,1142,1143],{},"node_runs.py",[559,1145,1146],{},"Pins the commit each node run started and ended on.",[544,1148,1149,1154],{},[559,1150,1151],{},[514,1152,1153],{},"progress.py",[559,1155,1156,1157,1160],{},"Reads a plan's ",[514,1158,1159],{},"## Task N"," headings for \"Task 3 of 6\".",[533,1162,1164],{"id":1163},"templates","Templates",[538,1166,1167,1175],{},[541,1168,1169],{},[544,1170,1171,1173],{},[547,1172,549],{},[547,1174,552],{},[554,1176,1177,1187,1206,1221,1231,1241,1254,1264],{},[544,1178,1179,1184],{},[559,1180,1181],{},[514,1182,1183],{},"templates\u002Fmodels.py",[559,1185,1186],{},"The typed chain schema: tasks, steps, nodes, chains, canonical paths.",[544,1188,1189,1194],{},[559,1190,1191],{},[514,1192,1193],{},"templates\u002Flibrary.py",[559,1195,1069,1196,581,1199,1202,1203,521],{},[514,1197,1198],{},"library.yaml",[514,1200,1201],{},"chains\u002F"," from the config directory and resolves ",[514,1204,1205],{},"extends",[544,1207,1208,1213],{},[559,1209,1210],{},[514,1211,1212],{},"templates\u002Fenvironment.py",[559,1214,1215,1216,1220],{},"Workspaces, areas, targets and ",[519,1217,1219],{"href":1218},"\u002Fconcepts\u002Fvocabulary#harness-profile","harness profiles"," a chain runs against.",[544,1222,1223,1228],{},[559,1224,1225],{},[514,1226,1227],{},"templates\u002Frevision.py",[559,1229,1230],{},"Plan-driven chain revision.",[544,1232,1233,1238],{},[559,1234,1235],{},[514,1236,1237],{},"templates\u002Fretry.py",[559,1239,1240],{},"Policy-bounded overrides a retry may carry.",[544,1242,1243,1251],{},[559,1244,1245,574,1248],{},[514,1246,1247],{},"templates\u002Fcatalogue.py",[514,1249,1250],{},"templates\u002Fpositions.py",[559,1252,1253],{},"The library as a list for the UI, and YAML positions for editor errors.",[544,1255,1256,1261],{},[559,1257,1258],{},[514,1259,1260],{},"overrides.py",[559,1262,1263],{},"Validates per-item model and per-node overrides.",[544,1265,1266,1274],{},[559,1267,1268,574,1271],{},[514,1269,1270],{},"skill.py",[514,1272,1273],{},"skills\u002F",[559,1275,1276],{},"The method an agent follows (spec, plan, code review, and so on), injected through its system prompt.",[533,1278,1280],{"id":1279},"agents-and-workers","Agents and workers",[538,1282,1283,1291],{},[541,1284,1285],{},[544,1286,1287,1289],{},[547,1288,549],{},[547,1290,552],{},[554,1292,1293,1311,1324,1334,1344,1366,1379,1392,1402,1412,1425,1452,1466,1481],{},[544,1294,1295,1303],{},[559,1296,1297,574,1300],{},[514,1298,1299],{},"harness.py",[514,1301,1302],{},"harnesses\u002F*.yaml",[559,1304,1305,1306,1310],{},"A ",[519,1307,1309],{"href":1308},"\u002Fconcepts\u002Fvocabulary#harness","harness",": how to launch one agent CLI, described as data.",[544,1312,1313,1321],{},[559,1314,1315,574,1318],{},[514,1316,1317],{},"adapters\u002Fagent.py",[514,1319,1320],{},"adapters\u002Fprofiles.py",[559,1322,1323],{},"Resolve an agent task to a harness profile and an agent profile, and build its command line and context.",[544,1325,1326,1331],{},[559,1327,1328],{},[514,1329,1330],{},"adapters\u002Fsubprocess.py",[559,1332,1333],{},"Launch a session, watch its log, read its result file, settle its status.",[544,1335,1336,1341],{},[559,1337,1338],{},[514,1339,1340],{},"adapters\u002Fartifact_notes.py",[559,1342,1343],{},"What each document kind is for, in the prompt.",[544,1345,1346,1363],{},[559,1347,1348,574,1351,574,1354,574,1357,574,1360],{},[514,1349,1350],{},"adapters\u002Fhook_install.py",[514,1352,1353],{},"permission_hooks.py",[514,1355,1356],{},"permission_rules.py",[514,1358,1359],{},"grants.py",[514,1361,1362],{},"registration.py",[559,1364,1365],{},"The permission gate across harnesses: hook install, tool policy written into each CLI's config, named grants, and the permission tool's name.",[544,1367,1368,1376],{},[559,1369,1370,574,1373],{},[514,1371,1372],{},"usage.py",[514,1374,1375],{},"logs.py",[559,1377,1378],{},"Token, cost and time per session, and reading a session's log.",[544,1380,1381,1389],{},[559,1382,1383,574,1386],{},[514,1384,1385],{},"worker\u002Fenv.py",[514,1387,1388],{},"worker\u002Fsteering.py",[559,1390,1391],{},"A worker's environment, and the standards injected into its prompt.",[544,1393,1394,1399],{},[559,1395,1396],{},[514,1397,1398],{},"worker\u002Freattach.py",[559,1400,1401],{},"Adopting sessions that survived a restart.",[544,1403,1404,1409],{},[559,1405,1406],{},[514,1407,1408],{},"worker\u002Fworktree_read.py",[559,1410,1411],{},"Reading a file an agent wrote, safely.",[544,1413,1414,1422],{},[559,1415,1416,574,1419],{},[514,1417,1418],{},"worker\u002Fbackends\u002F",[514,1420,1421],{},"worker\u002Fsandbox.py",[559,1423,1424],{},"Sandboxed sessions in Docker or Podman, and host git hardening.",[544,1426,1427,1444],{},[559,1428,1429,574,1432,574,1435,574,1438,574,1441],{},[514,1430,1431],{},"worker\u002Fegress.py",[514,1433,1434],{},"worker\u002Fchannel.py",[514,1436,1437],{},"worker\u002Fca.py",[514,1439,1440],{},"worker\u002Finject.py",[514,1442,1443],{},"worker\u002Fcallback.py",[559,1445,1446,1447,1451],{},"The egress proxy for ",[519,1448,1450],{"href":1449},"\u002Fconcepts\u002Fvocabulary#sandbox","sandboxed"," sessions: per-session channels, its CA, injected credentials, and what a worker's callbacks may reach.",[544,1453,1454,1459],{},[559,1455,1456],{},[514,1457,1458],{},"worker\u002Frefstore.py",[559,1460,1461,1462,521],{},"A sandboxed worker's private ",[519,1463,1465],{"href":1464},"\u002Fconcepts\u002Fvocabulary#ref-store","ref store",[544,1467,1468,1473],{},[559,1469,1470],{},[514,1471,1472],{},"worker\u002Fkit.py",[559,1474,1475,1476,1480],{},"Reads one Docker Sandbox ",[519,1477,1479],{"href":1478},"\u002Fconcepts\u002Fvocabulary#kit","Kit"," you wrote and lowers it onto the docker backend's policy.",[544,1482,1483,1494],{},[559,1484,1485,574,1488,574,1491],{},[514,1486,1487],{},"worker\u002Fsession_mcp.py",[514,1489,1490],{},"worker\u002Fshim.py",[514,1492,1493],{},"worker\u002Fbin\u002Fkraft",[559,1495,1496,1497,1499],{},"The MCP server and ",[514,1498,569],{}," shim a sandboxed worker calls back through.",[533,1501,1503],{"id":1502},"forge-and-trackers","Forge and trackers",[538,1505,1506,1514],{},[541,1507,1508],{},[544,1509,1510,1512],{},[547,1511,549],{},[547,1513,552],{},[554,1515,1516,1526,1546,1565,1575,1589,1608],{},[544,1517,1518,1523],{},[559,1519,1520],{},[514,1521,1522],{},"adapters\u002Fforge\u002Frun.py",[559,1524,1525],{},"Picks the backend and runs a forge node against one or several repos.",[544,1527,1528,1536],{},[559,1529,1530,574,1533],{},[514,1531,1532],{},"adapters\u002Fforge\u002Fgh.py",[514,1534,1535],{},"adapters\u002Fforge\u002Fglab.py",[559,1537,1538,1539,1542,1543,521],{},"GitHub through ",[514,1540,1541],{},"gh",", GitLab through ",[514,1544,1545],{},"glab",[544,1547,1548,1562],{},[559,1549,1550,574,1553,574,1556,574,1559],{},[514,1551,1552],{},"adapters\u002Fforge\u002Fgit.py",[514,1554,1555],{},"adapters\u002Fforge\u002Fmr.py",[514,1557,1558],{},"adapters\u002Fforge\u002Fci.py",[514,1560,1561],{},"adapters\u002Fforge\u002Fmodels.py",[559,1563,1564],{},"Local git, the merge request's title and body, reading a pipeline, and the shared types.",[544,1566,1567,1572],{},[559,1568,1569],{},[514,1570,1571],{},"automated_review.py",[559,1573,1574],{},"Which automated reviewer a repo expects.",[544,1576,1577,1582],{},[559,1578,1579],{},[514,1580,1581],{},"detect.py",[559,1583,1584,1585,1588],{},"What ",[514,1586,1587],{},"kraft repo connect"," proposes as a repository's setup and test commands.",[544,1590,1591,1599],{},[559,1592,1593,574,1596],{},[514,1594,1595],{},"adapters\u002Fbeads.py",[514,1597,1598],{},"intake.py",[559,1600,1601,1604,1605,521],{},[514,1602,1603],{},"bd"," calls, and auto-intake from ",[514,1606,1607],{},"bd ready",[544,1609,1610,1615],{},[559,1611,1612],{},[514,1613,1614],{},"triggers.py",[559,1616,1617,1618,521],{},"Cron schedules from ",[514,1619,326],{},[533,1621,1623],{"id":1622},"state-and-configuration","State and configuration",[538,1625,1626,1634],{},[541,1627,1628],{},[544,1629,1630,1632],{},[547,1631,549],{},[547,1633,552],{},[554,1635,1636,1649,1663,1703,1720,1733,1743,1753,1763,1773,1783,1793,1817,1830],{},[544,1637,1638,1643],{},[559,1639,1640],{},[514,1641,1642],{},"db.py",[559,1644,1645,1646,521],{},"The schema, its migrations, and the single-writer ",[514,1647,1648],{},"Database",[544,1650,1651,1656],{},[559,1652,1653],{},[514,1654,1655],{},"events.py",[559,1657,1658,1659,1662],{},"Appending to and reading the ",[514,1660,1661],{},"events"," table.",[544,1664,1665,1670],{},[559,1666,1667],{},[514,1668,1669],{},"store\u002F",[559,1671,1672,1673,574,1675,574,1678,574,1680,574,1682,574,1685,574,1688,574,1690,574,1692,574,1695,1698,1699,1702],{},"Every query, by table: ",[514,1674,710],{},[514,1676,1677],{},"chain",[514,1679,716],{},[514,1681,728],{},[514,1683,1684],{},"counters",[514,1686,1687],{},"budget",[514,1689,719],{},[514,1691,731],{},[514,1693,1694],{},"forks",[514,1696,1697],{},"intake",". ",[514,1700,1701],{},"_common.py"," holds the rule that an ended item never becomes runnable.",[544,1704,1705,1710],{},[559,1706,1707],{},[514,1708,1709],{},"paths.py",[559,1711,1712,1715,1716,1719],{},[514,1713,1714],{},"$KRAFT_HOME"," and the ",[514,1717,1718],{},"run\u002F"," layout.",[544,1721,1722,1730],{},[559,1723,1724,574,1727],{},[514,1725,1726],{},"config.py",[514,1728,1729],{},"config_schemas.py",[559,1731,1732],{},"Reading and writing the YAML files, and their JSON Schemas for editors.",[544,1734,1735,1740],{},[559,1736,1737],{},[514,1738,1739],{},"capabilities.py",[559,1741,1742],{},"What this version can do that an older seeded config cannot.",[544,1744,1745,1750],{},[559,1746,1747],{},[514,1748,1749],{},"index\u002F",[559,1751,1752],{},"The search index: chunking, local embeddings, ingest, and the query service.",[544,1754,1755,1760],{},[559,1756,1757],{},[514,1758,1759],{},"analytics.py",[559,1761,1762],{},"The numbers behind the Analytics view.",[544,1764,1765,1770],{},[559,1766,1767],{},[514,1768,1769],{},"archive.py",[559,1771,1772],{},"Auto-archive of old ended items.",[544,1774,1775,1780],{},[559,1776,1777],{},[514,1778,1779],{},"notify.py",[559,1781,1782],{},"Outbound notifications.",[544,1784,1785,1790],{},[559,1786,1787],{},[514,1788,1789],{},"auth.py",[559,1791,1792],{},"Password login and sessions for off-localhost access.",[544,1794,1795,1806],{},[559,1796,1797,574,1800,574,1803],{},[514,1798,1799],{},"doctor.py",[514,1801,1802],{},"update.py",[514,1804,1805],{},"init.py",[559,1807,1808,574,1811,581,1814,521],{},[514,1809,1810],{},"kraft admin doctor",[514,1812,1813],{},"update",[514,1815,1816],{},"init",[544,1818,1819,1824],{},[559,1820,1821],{},[514,1822,1823],{},"pidfile.py",[559,1825,1826,1829],{},[514,1827,1828],{},"run\u002Fkraft.pid",": which process is this run dir's server, held under a lock.",[544,1831,1832,1837],{},[559,1833,1834],{},[514,1835,1836],{},"intent.py",[559,1838,1839,1840,1843],{},"Checks the intent tree in ",[514,1841,1842],{},"docs\u002Fintent\u002F"," (a CI check, not part of the server).",[510,1845,1846,1847,1849,1850,1853,1854,1857,1858,1861,1862,1865,1866,521],{},"Outside ",[514,1848,516],{},": the web UI is in ",[514,1851,1852],{},"frontend\u002Fsrc\u002Fng\u002F"," (a folder per area),\nthe shipped default configuration is in ",[514,1855,1856],{},"config\u002F",", the agent plugins are in\n",[514,1859,1860],{},"plugins\u002F",", the VS Code extension is in ",[514,1863,1864],{},"vscode\u002F",", and contributor scripts are\nin ",[514,1867,1868],{},"dev\u002F",[523,1870,1872],{"id":1871},"workspace-members","Workspace members",[510,1874,1875,1876,1880,1881,1884,1885,1887,1888,1891,1892,521],{},"A sandbox covers a ",[519,1877,1879],{"href":1878},"\u002Fconcepts\u002Fvocabulary#workspace","workspace","'s members as it covers the root. A member is a\nworktree of its connected repository (",[514,1882,1883],{},"_setup_submodules"," in ",[514,1886,999],{},"), so\nhost git in it reads that repository's config, not a git directory under the\nroot's worktree. It also reads the member's own ",[514,1889,1890],{},"config.worktree"," when that\nrepository sets ",[514,1893,1894],{},"extensions.worktreeConfig",[538,1896,1897,1907],{},[541,1898,1899],{},[544,1900,1901,1904],{},[547,1902,1903],{},"What a sandboxed container sees of a member",[547,1905,1906],{},"Enforced by",[554,1908,1909,1924,1952],{},[544,1910,1911,1917],{},[559,1912,1913,1914,1916],{},"Its refs go through a ",[519,1915,1465],{"href":1464}," of its own.",[559,1918,1919,1884,1922],{},[514,1920,1921],{},"prepare_stores",[514,1923,1458],{},[544,1925,1926,1944],{},[559,1927,1928,1929,1932,1933,574,1936,581,1939,1941,1942,521],{},"Its ",[514,1930,1931],{},".git",", and the ",[514,1934,1935],{},"commondir",[514,1937,1938],{},"gitdir",[514,1940,1890],{}," of its admin directory, are read-only. They are mounted from paths derived from the connected repository, never read from the member's ",[514,1943,1931],{},[559,1945,1946,1884,1949],{},[514,1947,1948],{},"_gitdir_mounts",[514,1950,1951],{},"worker\u002Fbackends\u002Fdocker.py",[544,1953,1954,1960],{},[559,1955,1956,1957,1959],{},"Each directory from the worktree down to the member is mounted onto itself, so no container can rename it and put another ",[514,1958,1931],{}," in the member's place.",[559,1961,1962,1884,1965],{},[514,1963,1964],{},"_pin_path",[514,1966,1951],{},[510,1968,1969],{},"Before host git runs in a member, Kraft checks it against the checkout Kraft\nmade:",[1971,1972,1973,1989],"ul",{},[1974,1975,1976,1977,1884,1980,1982,1983,1884,1986,1988],"li",{},"For a sandboxed item, ",[514,1978,1979],{},"refuse_planted_repos",[514,1981,907],{}," runs the\ncheck (",[514,1984,1985],{},"foreign_members",[514,1987,1421],{},"). A task's launch mounts\nexactly the checkout that check returned.",[1974,1990,1991,1992,1995,1996,1999],{},"Every other sandboxed launch takes its checkout from ",[514,1993,1994],{},"sandbox_checkout",".\nThese are a gate review, an ",[519,1997,1998],{"href":1094},"escalation turn",", a review reply and the setup\ncommand. It runs the same check and leaves out any member that fails it, so\nthe launch does not start.",[523,2001,2003],{"id":2002},"where-to-change-things","Where to change things",[538,2005,2006,2016],{},[541,2007,2008],{},[544,2009,2010,2013],{},[547,2011,2012],{},"To",[547,2014,2015],{},"Change",[554,2017,2018,2046,2064,2078,2097,2118,2135,2149,2174,2189,2202,2213,2233,2245],{},[544,2019,2020,2023],{},[559,2021,2022],{},"Add a CLI verb or MCP tool",[559,2024,2025,2026,2029,2030,2033,2034,2029,2037,2040,2041,1932,2043,2045],{},"A function in ",[514,2027,2028],{},"client\u002Factions.py"," or ",[514,2031,2032],{},"client\u002Freads.py",", its verb in ",[514,2035,2036],{},"cli\u002Fitem.py",[514,2038,2039],{},"cli\u002Fview.py",", its tool in ",[514,2042,625],{},[519,2044,260],{"href":261}," reference.",[544,2047,2048,2051],{},[559,2049,2050],{},"Add an API route",[559,2052,2053,2054,2057,2058,2061,2062,521],{},"A handler on ",[514,2055,2056],{},"api_router"," in the matching ",[514,2059,2060],{},"api\u002Froutes\u002F*.py",". A new module is imported in ",[514,2063,640],{},[544,2065,2066,2069],{},[559,2067,2068],{},"Add a harness",[559,2070,2071,2072,2075,2076,521],{},"A YAML file in ",[514,2073,2074],{},"harnesses\u002F",". See ",[519,2077,123],{"href":124},[544,2079,2080,2083],{},[559,2081,2082],{},"Add a builtin action",[559,2084,2085,2086,1884,2089,2091,2092,2094,2095,521],{},"A member of ",[514,2087,2088],{},"BuiltinAction",[514,2090,1183],{},", its branch in ",[514,2093,882],{},", and the work in ",[514,2096,999],{},[544,2098,2099,2102],{},[559,2100,2101],{},"Add a forge action or backend",[559,2103,2104,1884,2107,581,2109,2111,2112,581,2115,521],{},[514,2105,2106],{},"ForgeAction",[514,2108,1183],{},[514,2110,1522],{},"; a backend beside ",[514,2113,2114],{},"gh.py",[514,2116,2117],{},"glab.py",[544,2119,2120,2123],{},[559,2121,2122],{},"Change a shipped chain or library component",[559,2124,2125,581,2128,2131,2132,521],{},[514,2126,2127],{},"config\u002Fchains\u002F*.yaml",[514,2129,2130],{},"config\u002Flibrary.yaml"," at the repo root. Run ",[514,2133,2134],{},"kraft admin templates lint",[544,2136,2137,2140],{},[559,2138,2139],{},"Change what an agent is told",[559,2141,2142,2143,2146,2147,521],{},"The skill in ",[514,2144,2145],{},"skills\u002F\u003Cname>\u002FSKILL.md",", or Kraft's own notes in ",[514,2148,947],{},[544,2150,2151,2157],{},[559,2152,2153,2154,2156],{},"Add a ",[514,2155,310],{}," key",[559,2158,2159,581,2162,1884,2165,2167,2168,2171,2172,521],{},[514,2160,2161],{},"PolicyInput",[514,2163,2164],{},"Policy",[514,2166,1066],{},", the default in ",[514,2169,2170],{},"config\u002Fpolicy.yaml",", and ",[519,2173,310],{"href":311},[544,2175,2176,2180],{},[559,2177,2153,2178,2156],{},[514,2179,292],{},[559,2181,2182,1884,2185,2171,2187,521],{},[514,2183,2184],{},"RepoEntry",[514,2186,1726],{},[519,2188,292],{"href":293},[544,2190,2191,2194],{},[559,2192,2193],{},"Change the database",[559,2195,2196,2197,2199,2200,521],{},"A new numbered migration in ",[514,2198,1642],{},", and the queries in ",[514,2201,1669],{},[544,2203,2204,2207],{},[559,2205,2206],{},"Change how a stop is handled",[559,2208,2209,581,2211,521],{},[514,2210,867],{},[514,2212,907],{},[544,2214,2215,2218],{},[559,2216,2217],{},"Add a status transition",[559,2219,2220,2221,2223,2224,1884,2227,2230,2231,521],{},"The write in ",[514,2222,1669],{},", through ",[514,2225,2226],{},"write_status",[514,2228,2229],{},"store\u002F_common.py",", and the door in ",[514,2232,758],{},[544,2234,2235,2241],{},[559,2236,2153,2237,2240],{},[514,2238,2239],{},"doctor"," check",[559,2242,2243,521],{},[514,2244,1799],{},[544,2246,2247,2250],{},[559,2248,2249],{},"Change a screen",[559,2251,2252,2253,2255,2256,574,2259,574,2262,574,2265,574,2268,2271],{},"Its area's folder under ",[514,2254,1852],{}," (",[514,2257,2258],{},"board\u002F",[514,2260,2261],{},"item\u002F",[514,2263,2264],{},"review\u002F",[514,2266,2267],{},"templates\u002F",[514,2269,2270],{},"settings\u002F"," and so on).",[523,2273,2275],{"id":2274},"related","Related",[1971,2277,2278,2283],{},[1974,2279,2280,2282],{},[519,2281,493],{"href":494},": how these parts fit together, and where each trust boundary is enforced.",[1974,2284,2285,2287],{},[519,2286,501],{"href":502},": the steps to take before you open a pull request.",{"title":2289,"searchDepth":2290,"depth":2290,"links":2291},"",2,[2292,2301,2302,2303],{"id":525,"depth":2290,"text":526,"children":2293},[2294,2296,2297,2298,2299,2300],{"id":535,"depth":2295,"text":536},3,{"id":837,"depth":2295,"text":838},{"id":1163,"depth":2295,"text":1164},{"id":1279,"depth":2295,"text":1280},{"id":1502,"depth":2295,"text":1503},{"id":1622,"depth":2295,"text":1623},{"id":1871,"depth":2290,"text":1872},{"id":2002,"depth":2290,"text":2003},{"id":2274,"depth":2290,"text":2275},"Which module under src\u002Fkraft\u002F holds what, and where to go to change a given thing.","md",null,{},true,{"title":497,"description":2304},"_CDzAR5v5k_2FaUSZrNSM-Bu5lhEmoOgylytPo0tbJM",[2312,2314],{"title":493,"path":494,"stem":495,"description":2313,"children":-1},"One FastAPI process, the executor inside it, the worker sessions it spawns, how a work item flows through them, and where each trust boundary is enforced.",{"title":501,"path":502,"stem":503,"description":2315,"children":-1},"The steps to contribute a change, and where the full contributor guide and the release process live.",1791801251291]