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