[{"data":1,"prerenderedAt":2225},["ShallowReactive",2],{"navigation_docs":3,"-project-architecture":270,"-project-architecture-surround":2220},[4,28,51,110,243],{"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},"Troubleshooting and FAQ","\u002Fget-started\u002Ftroubleshooting","1.get-started\u002F3.troubleshooting",{"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},"Vocabulary","\u002Fconcepts\u002Fvocabulary","2.concepts\u002F1.vocabulary",{"title":40,"path":41,"stem":42},"How a work item runs","\u002Fconcepts\u002Fhow-a-work-item-runs","2.concepts\u002F2.how-a-work-item-runs",{"title":44,"path":45,"stem":46},"Caps and budgets","\u002Fconcepts\u002Fcaps-and-budgets","2.concepts\u002F3.caps-and-budgets",{"title":48,"path":49,"stem":50},"Why a permission gate","\u002Fconcepts\u002Fpermission-gate","2.concepts\u002F4.permission-gate",{"title":52,"path":53,"stem":54,"children":55},"Guides","\u002Fguides","3.guides",[56,58,62,66,70,74,78,82,86,90,94,98,102,106],{"title":10,"path":53,"stem":57},"3.guides\u002Findex",{"title":59,"path":60,"stem":61},"Use Kraft from your agent","\u002Fguides\u002Fagent-integration","3.guides\u002F01.agent-integration",{"title":63,"path":64,"stem":65},"Kraft Lite","\u002Fguides\u002Fkraft-lite","3.guides\u002F02.kraft-lite",{"title":67,"path":68,"stem":69},"Remote access","\u002Fguides\u002Fremote-access","3.guides\u002F03.remote-access",{"title":71,"path":72,"stem":73},"Add or override a harness","\u002Fguides\u002Fadding-a-harness","3.guides\u002F04.adding-a-harness",{"title":75,"path":76,"stem":77},"Schedule or webhook work","\u002Fguides\u002Fschedule-and-webhook-work","3.guides\u002F05.schedule-and-webhook-work",{"title":79,"path":80,"stem":81},"Add a security review or a gate reviewer","\u002Fguides\u002Fadd-review-agents","3.guides\u002F06.add-review-agents",{"title":83,"path":84,"stem":85},"Kraft for VS Code","\u002Fguides\u002Fvscode","3.guides\u002F07.vscode",{"title":87,"path":88,"stem":89},"Reviewing a change","\u002Fguides\u002Freview-a-change","3.guides\u002F08.review-a-change",{"title":91,"path":92,"stem":93},"Write your own chain","\u002Fguides\u002Fwrite-your-own-chain","3.guides\u002F09.write-your-own-chain",{"title":95,"path":96,"stem":97},"Switch a harness","\u002Fguides\u002Fswitch-harness","3.guides\u002F10.switch-harness",{"title":99,"path":100,"stem":101},"Upgrade your templates","\u002Fguides\u002Fupgrading-templates","3.guides\u002F11.upgrading-templates",{"title":103,"path":104,"stem":105},"Operations","\u002Fguides\u002Foperations","3.guides\u002F12.operations",{"title":107,"path":108,"stem":109},"Worker Kit","\u002Fguides\u002Fworker-kit","3.guides\u002F13.worker-kit",{"title":111,"path":112,"stem":113,"children":114},"Reference","\u002Freference","4.reference",[115,117,139,183,201,205,227,231,235,239],{"title":10,"path":112,"stem":116},"4.reference\u002Findex",{"title":118,"path":119,"stem":120,"children":121},"CLI","\u002Freference\u002Fcli","4.reference\u002F1.cli\u002Findex",[122,123,127,131,135],{"title":10,"path":119,"stem":120},{"title":124,"path":125,"stem":126},"Item verbs","\u002Freference\u002Fcli\u002Fitem","4.reference\u002F1.cli\u002F2.item",{"title":128,"path":129,"stem":130},"View verbs","\u002Freference\u002Fcli\u002Fview","4.reference\u002F1.cli\u002F3.view",{"title":132,"path":133,"stem":134},"Repo verbs","\u002Freference\u002Fcli\u002Frepo","4.reference\u002F1.cli\u002F4.repo",{"title":136,"path":137,"stem":138},"Admin verbs","\u002Freference\u002Fcli\u002Fadmin","4.reference\u002F1.cli\u002F5.admin",{"title":140,"path":141,"stem":142,"children":143},"Configuration","\u002Freference\u002Fconfiguration","4.reference\u002F2.configuration\u002Findex",[144,145,155,159,163,167,171,175,179],{"title":10,"path":141,"stem":142},{"title":146,"path":147,"stem":148,"children":149},"Repos","\u002Freference\u002Fconfiguration\u002Frepos","4.reference\u002F2.configuration\u002F2.repos\u002Findex",[150,151],{"title":10,"path":147,"stem":148},{"title":152,"path":153,"stem":154},"Workspaces","\u002Freference\u002Fconfiguration\u002Frepos\u002Fworkspaces","4.reference\u002F2.configuration\u002F2.repos\u002F3.workspaces",{"title":156,"path":157,"stem":158},"Policy","\u002Freference\u002Fconfiguration\u002Fpolicy","4.reference\u002F2.configuration\u002F3.policy",{"title":160,"path":161,"stem":162},"Library and chains","\u002Freference\u002Fconfiguration\u002Flibrary-and-chains","4.reference\u002F2.configuration\u002F4.library-and-chains",{"title":164,"path":165,"stem":166},"Harnesses file","\u002Freference\u002Fconfiguration\u002Fharnesses-file","4.reference\u002F2.configuration\u002F5.harnesses-file",{"title":168,"path":169,"stem":170},"Access","\u002Freference\u002Fconfiguration\u002Faccess","4.reference\u002F2.configuration\u002F6.access",{"title":172,"path":173,"stem":174},"Intake","\u002Freference\u002Fconfiguration\u002Fintake","4.reference\u002F2.configuration\u002F7.intake",{"title":176,"path":177,"stem":178},"Sandbox host","\u002Freference\u002Fconfiguration\u002Fsandbox","4.reference\u002F2.configuration\u002F8.sandbox",{"title":180,"path":181,"stem":182},"Environment variables","\u002Freference\u002Fconfiguration\u002Fenvironment-variables","4.reference\u002F2.configuration\u002F9.environment-variables",{"title":184,"path":185,"stem":186,"children":187},"Chain nodes","\u002Freference\u002Fchain-nodes","4.reference\u002F3.chain-nodes\u002Findex",[188,189,193,197],{"title":10,"path":185,"stem":186},{"title":190,"path":191,"stem":192},"Subprocess tasks","\u002Freference\u002Fchain-nodes\u002Fsubprocess-tasks","4.reference\u002F3.chain-nodes\u002F2.subprocess-tasks",{"title":194,"path":195,"stem":196},"Fix loop and judge","\u002Freference\u002Fchain-nodes\u002Ffix-loop","4.reference\u002F3.chain-nodes\u002F3.fix-loop",{"title":198,"path":199,"stem":200},"Result file","\u002Freference\u002Fchain-nodes\u002Fresult-file","4.reference\u002F3.chain-nodes\u002F4.result-file",{"title":202,"path":203,"stem":204},"Permission gate","\u002Freference\u002Fpermissions","4.reference\u002F4.permissions",{"title":206,"path":207,"stem":208,"children":209},"Agent harnesses","\u002Freference\u002Fharnesses","4.reference\u002F5.harnesses\u002Findex",[210,211,215,219,223],{"title":10,"path":207,"stem":208},{"title":212,"path":213,"stem":214},"Unattended runs","\u002Freference\u002Fharnesses\u002Funattended-runs","4.reference\u002F5.harnesses\u002F2.unattended-runs",{"title":216,"path":217,"stem":218},"Agent profiles","\u002Freference\u002Fharnesses\u002Fagent-profiles","4.reference\u002F5.harnesses\u002F3.agent-profiles",{"title":220,"path":221,"stem":222},"Harness files","\u002Freference\u002Fharnesses\u002Fharness-files","4.reference\u002F5.harnesses\u002F4.harness-files",{"title":224,"path":225,"stem":226},"Fallback and escalation","\u002Freference\u002Fharnesses\u002Ffallback-and-escalation","4.reference\u002F5.harnesses\u002F5.fallback-and-escalation",{"title":228,"path":229,"stem":230},"Inbound triggers","\u002Freference\u002Ftriggers","4.reference\u002F6.triggers",{"title":232,"path":233,"stem":234},"HTTP API","\u002Freference\u002Fhttp-api","4.reference\u002F7.http-api",{"title":236,"path":237,"stem":238},"MCP tools","\u002Freference\u002Fmcp-tools","4.reference\u002F8.mcp-tools",{"title":240,"path":241,"stem":242},"Events","\u002Freference\u002Fevents","4.reference\u002F9.events",{"title":244,"path":245,"stem":246,"children":247},"Project","\u002Fproject","5.project",[248,250,254,258,262,266],{"title":10,"path":245,"stem":249},"5.project\u002Findex",{"title":251,"path":252,"stem":253},"Architecture","\u002Fproject\u002Farchitecture","5.project\u002F1.architecture",{"title":255,"path":256,"stem":257},"Contributing","\u002Fproject\u002Fcontributing","5.project\u002F2.contributing",{"title":259,"path":260,"stem":261},"Security","\u002Fproject\u002Fsecurity","5.project\u002F3.security",{"title":263,"path":264,"stem":265},"Data and privacy","\u002Fproject\u002Fdata-and-privacy","5.project\u002F4.data-and-privacy",{"title":267,"path":268,"stem":269},"Status and support","\u002Fproject\u002Fstatus-and-support","5.project\u002F5.status-and-support",{"id":271,"title":251,"body":272,"description":2213,"extension":2214,"links":2215,"meta":2216,"navigation":2217,"path":252,"seo":2218,"stem":253,"__hash__":2219},"docs\u002F5.project\u002F1.architecture.md",{"type":273,"value":274,"toc":2195},"minimark",[275,284,294,299,306,425,429,435,580,587,591,598,726,793,797,802,807,1008,1012,1292,1296,1397,1401,1578,1582,1680,1684,1883,1910,1914,2165,2170,2174],[276,277,278,279,283],"p",{},"Kraft is one Python process on your machine. It serves a React SPA and an HTTP\nAPI, walks each work item's chain, and spawns a coding agent or a command for\neach task. Everything it knows is in one SQLite database. This page shows how\nthose parts fit, and where in ",[280,281,282],"code",{},"src\u002Fkraft\u002F"," to change each one.",[276,285,286,287,290,291,293],{},"For what a work item does, step by step and status by status, read\n",[288,289,40],"a",{"href":41}," first. For the words,\nsee ",[288,292,36],{"href":37},".",[295,296,298],"h2",{"id":297},"the-parts","The parts",[276,300,301],{},[302,303],"img",{"alt":304,"src":305},"Kraft's components: clients, the FastAPI process with its API, executor, pollers and stores, worker sessions in a git worktree, and the forge CLIs","\u002Fdiagrams\u002Fcomponents.svg",[307,308,309,333,350,359,365,379,403],"ul",{},[310,311,312,316,317,320,321,324,325,328,329,332],"li",{},[313,314,315],"strong",{},"One process."," ",[280,318,319],{},"kraft"," (or ",[280,322,323],{},"kraft admin start",") runs uvicorn with the\nFastAPI app from ",[280,326,327],{},"src\u002Fkraft\u002Fapi\u002F",". The same process serves the built SPA,\nanswers the API under ",[280,330,331],{},"\u002Fapi",", pushes events over a WebSocket, and runs every\nwork item's walk as an asyncio task. There is no queue, broker or second\nserver.",[310,334,335,338,339,341,342,345,346,349],{},[313,336,337],{},"Clients."," The SPA, the ",[280,340,319],{}," CLI and the MCP server all call the same\nHTTP API. The MCP server is ",[280,343,344],{},"kraft admin mcp",": a separate stdio process that\nyour coding agent starts, with one tool per CLI verb. Both go through\n",[280,347,348],{},"src\u002Fkraft\u002Fclient\u002F",", so a verb and its tool cannot drift apart.",[310,351,352,316,355,358],{},[313,353,354],{},"The executor.",[280,356,357],{},"src\u002Fkraft\u002Fexecutor\u002F"," walks a work item's frozen chain node\nby node. It runs builtin and forge tasks inside the process and launches\nagent and subprocess tasks as child processes. It is started by an API\nrequest (resume, retry, approve, reject, skip) or by a poller.",[310,360,361,364],{},[313,362,363],{},"Worker sessions."," Each agent task is a headless agent CLI (Claude Code,\nCodex, Gemini, Antigravity, Cursor, OpenCode or Amp) started in the item's git worktree, with an environment built from an allowlist. With a sandbox\nconfigured, it runs in a container (Docker or Podman) instead, and reaches the network\nonly through Kraft's egress proxy. A worker talks back to Kraft for\npermission decisions, plan progress and review replies.",[310,366,367,370,371,374,375,378],{},[313,368,369],{},"Pollers."," Background tasks in the same process re-enter items that are\n",[280,372,373],{},"waiting"," or ",[280,376,377],{},"rate_limited",", stop parked items whose time cap ran out, fire\ncron triggers, pick up ready beads when auto-intake is on, fire delayed\nauto-escalations, and archive old ended items.",[310,380,381,316,384,387,388,391,392,395,396,398,399,402],{},[313,382,383],{},"Stores.",[280,385,386],{},"run\u002Forchestrator.db"," holds work items, sessions, gates, review\nthreads and an append-only ",[280,389,390],{},"events"," table. All writes go through one writer\nqueue (",[280,393,394],{},"src\u002Fkraft\u002Fdb.py","). The WebSocket, notifications and the search index\neach follow the ",[280,397,390],{}," tail. ",[280,400,401],{},"run\u002Findex.db"," is the full-text and vector\nsearch index over your repos' documents.",[310,404,405,408,409,412,413,416,417,420,421,424],{},[313,406,407],{},"Outside tools."," Kraft calls ",[280,410,411],{},"git"," for worktrees and rebases, ",[280,414,415],{},"gh"," or\n",[280,418,419],{},"glab"," for merge requests and CI, and ",[280,422,423],{},"bd"," for beads, each as a subprocess\nwith your own login.",[295,426,428],{"id":427},"from-filing-to-merge","From filing to merge",[276,430,431],{},[302,432],{"alt":433,"src":434},"Sequence of one work item: create, resume, the spec author, a gate, approval, the rest of the chain, a CI wait, final review, merge","\u002Fdiagrams\u002Frequest-flow.svg",[436,437,438,471,492,522,541,553,567],"ol",{},[310,439,440,443,444,447,448,451,452,455,456,459,460,463,464,467,468,293],{},[280,441,442],{},"kraft item create"," posts to ",[280,445,446],{},"POST \u002Fapi\u002Fwork-items","\n(",[280,449,450],{},"api\u002Froutes\u002Fwork_items.py","). ",[280,453,454],{},"executor\u002Fentry.py"," runs intake: it resolves\nthe chain (",[280,457,458],{},"templates\u002F","), freezes it and the effective policy onto a new\nrow (",[280,461,462],{},"store\u002Fwork_items.py","), and copies attachments to ",[280,465,466],{},"run\u002Fattachments\u002F",".\nThe item lands ",[280,469,470],{},"paused",[310,472,473,476,477,480,481,483,484,487,488,491],{},[280,474,475],{},"kraft item resume"," (",[280,478,479],{},"api\u002Froutes\u002Flifecycle.py",") claims the item with a\nconditional update from ",[280,482,470],{}," to ",[280,485,486],{},"active",", checks the slot limit in the\nsame statement, and spawns ",[280,489,490],{},"executor.run"," as a task.",[310,493,494,497,498,501,502,505,506,509,510,513,514,517,518,521],{},[280,495,496],{},"executor\u002Fwalk.py"," loads the chain, cuts the worktree (",[280,499,500],{},"builtins.py","), and\nwalks. For each exec node, ",[280,503,504],{},"executor\u002Fdispatch.py"," runs its steps.\nAn agent task goes through ",[280,507,508],{},"adapters\u002Fagent.py",", which builds the command\nline from the harness profile (",[280,511,512],{},"harness.py",", ",[280,515,516],{},"harnesses\u002F*.yaml","), then\n",[280,519,520],{},"adapters\u002Fsubprocess.py",", which launches it, watches its log, and reads its\nresult file and usage.",[310,523,524,525,528,529,532,533,536,537,540],{},"At a gate node, ",[280,526,527],{},"executor\u002Fgates.py"," sets ",[280,530,531],{},"needs_human"," and writes\n",[280,534,535],{},"gate_requested",". The walk task ends. The event reaches the board over the\nWebSocket and, if you configured one, an outbound notification (",[280,538,539],{},"notify.py",").",[310,542,543,476,546,549,550,552],{},[280,544,545],{},"kraft item approve",[280,547,548],{},"api\u002Froutes\u002Fgates.py",") checks for open must-fix\nthreads, sets the item ",[280,551,486],{}," again, and spawns a new walk at the node\nafter the gate.",[310,554,555,556,559,560,563,564,566],{},"Forge nodes (",[280,557,558],{},"adapters\u002Fforge\u002F",") open the draft merge request and read CI.\nA pending pipeline is an external wait (",[280,561,562],{},"waits.py","): the item goes\n",[280,565,373],{},", the walk task ends, and the wait scheduler re-enters the walk\nwhen the next check is due.",[310,568,569,570,573,574,577,578,540],{},"After ",[280,571,572],{},"final_review",", forge nodes mark the merge request ready, wait for any\nrequired approval, merge, and watch the post-merge pipeline. The walk marks the item\n",[280,575,576],{},"completed"," and closes its beads (",[280,579,454],{},[276,581,582,583,586],{},"A restart does not lose finished work. On startup, ",[280,584,585],{},"worker\u002Freattach.py"," finds\nthe sessions that were running, adopts the ones still alive, and resumes each\nitem's walk from the node and step it had reached.",[295,588,590],{"id":589},"trust-boundaries","Trust boundaries",[276,592,593,594,597],{},"Four lines matter. The ",[288,595,259],{"href":596},"\u002Fproject\u002Fsecurity#default-posture"," page\nstates what each one does and does not stop by default; this is only where\neach one lives in the code.",[599,600,601,614],"table",{},[602,603,604],"thead",{},[605,606,607,611],"tr",{},[608,609,610],"th",{},"Boundary",[608,612,613],{},"Enforced by",[615,616,617,636,669,711],"tbody",{},[605,618,619,623],{},[620,621,622],"td",{},"Network clients to the API",[620,624,625,628,629,632,633],{},[280,626,627],{},"api\u002Fperimeter.py"," (the local-client check and auth middleware), ",[280,630,631],{},"auth.py"," (password login and sessions), the bearer token in ",[280,634,635],{},"run\u002F",[605,637,638,641],{},[620,639,640],{},"A worker to Kraft",[620,642,643,644,513,647,513,650,513,653,656,657,660,661,664,665,668],{},"The permission gate (",[280,645,646],{},"api\u002Froutes\u002Fsessions.py",[280,648,649],{},"permission_hooks.py",[280,651,652],{},"permission_rules.py",[280,654,655],{},"grants.py","), and the self-action guard: ",[280,658,659],{},"client\u002Fcontext.py"," in the CLI and MCP server, and ",[280,662,663],{},"forbid_self_action"," in ",[280,666,667],{},"api\u002Fdeps.py"," for a worker that identifies itself",[605,670,671,674],{},[620,672,673],{},"A worker to your machine",[620,675,676,677,680,681,513,684,513,687,513,690,664,693,696,697,700,701,513,704,707,708],{},"Nothing, unless the repo sets ",[280,678,679],{},"sandbox:",". Then ",[280,682,683],{},"worker\u002Fbackends\u002Fdocker.py",[280,685,686],{},"worker\u002Fsandbox.py",[280,688,689],{},"worker\u002Frefstore.py",[280,691,692],{},"assert_on_branch",[280,694,695],{},"adapters\u002Fforge\u002Fgit.py"," before every host-side commit, rebase or push from its worktree, and for ",[280,698,699],{},"network:"," the egress proxy in ",[280,702,703],{},"worker\u002Fegress.py",[280,705,706],{},"worker\u002Fchannel.py"," and ",[280,709,710],{},"worker\u002Finject.py",[605,712,713,716],{},[620,714,715],{},"Kraft to your forge",[620,717,718,719,374,721,723,724],{},"Your own ",[280,720,415],{},[280,722,419],{}," login, used as is by ",[280,725,558],{},[276,727,728,729,664,732,734,735,738,739,742,743,746,747,749,750,753,754,513,757,760,761,763,764,664,767,769,770,772,773,664,776,779,780,664,783,785,786,789,790,792],{},"A workspace member is a worktree of its connected repository\n(",[280,730,731],{},"_setup_submodules",[280,733,500],{},"), so host git in it reads that\nrepository's config, not a gitdir under the root's worktree. It also reads the\nmember's own ",[280,736,737],{},"config.worktree"," when that repository sets\n",[280,740,741],{},"extensions.worktreeConfig",". A sandboxed container sees each member as it\nsees the root: its refs go through a ref store of its own (",[280,744,745],{},"prepare_stores"," in\n",[280,748,689],{},"), and its ",[280,751,752],{},".git"," and the ",[280,755,756],{},"commondir",[280,758,759],{},"gitdir"," and\n",[280,762,737],{}," of its admin directory are mounted read-only\n(",[280,765,766],{},"_gitdir_mounts",[280,768,683],{},"), from paths derived from the\nconnected repository and never read from the member's ",[280,771,752],{},". For a sandboxed item,\n",[280,774,775],{},"refuse_planted_repos",[280,777,778],{},"executor\u002Fstops.py"," checks each member against the\ncheckout Kraft made (",[280,781,782],{},"foreign_members",[280,784,686],{},") before host git\nruns there, and a task's launch mounts exactly the checkout that check\nreturned. Every other sandboxed launch (a gate review, an escalation turn, a\nreview reply, the setup command) takes its checkout from ",[280,787,788],{},"sandbox_checkout",",\nwhich runs the same check and leaves out any member that fails it, so the\nlaunch does not start. Each directory from the worktree down to a member is\nmounted onto itself, so no container can rename it and put another ",[280,791,752],{}," in\nthe member's place.",[295,794,796],{"id":795},"module-map","Module map",[276,798,799,800,293],{},"Every path below is under ",[280,801,282],{},[803,804,806],"h3",{"id":805},"serving","Serving",[599,808,809,819],{},[602,810,811],{},[605,812,813,816],{},[608,814,815],{},"Path",[608,817,818],{},"What it does",[615,820,821,847,873,885,895,905,918,927,978,988,998],{},[605,822,823,828],{},[620,824,825],{},[280,826,827],{},"cli\u002F",[620,829,830,831,833,834,513,837,513,840,707,843,846],{},"The ",[280,832,319],{}," command: ",[280,835,836],{},"item",[280,838,839],{},"view",[280,841,842],{},"repo",[280,844,845],{},"admin"," verb groups, and starting the server.",[605,848,849,854],{},[620,850,851],{},[280,852,853],{},"client\u002F",[620,855,856,857,860,861,864,865,868,869,872],{},"The one HTTP client. ",[280,858,859],{},"transport.py"," is the wire, ",[280,862,863],{},"actions.py"," changes things, ",[280,866,867],{},"reads.py"," reads, ",[280,870,871],{},"context.py"," knows which item a worker stands in.",[605,874,875,880],{},[620,876,877],{},[280,878,879],{},"mcp.py",[620,881,882,884],{},[280,883,344],{},": one MCP tool per client call.",[605,886,887,892],{},[620,888,889],{},[280,890,891],{},"api\u002F__init__.py",[620,893,894],{},"Builds the FastAPI app, installs middleware, serves the SPA.",[605,896,897,902],{},[620,898,899],{},[280,900,901],{},"api\u002Fstartup.py",[620,903,904],{},"The lifespan: opens the database, reattaches sessions, starts the pollers.",[605,906,907,911],{},[620,908,909],{},[280,910,667],{},[620,912,913,914,917],{},"Helpers shared by routes, including ",[280,915,916],{},"spawn",", which starts a walk.",[605,919,920,924],{},[620,921,922],{},[280,923,627],{},[620,925,926],{},"Who may call the API at all.",[605,928,929,934],{},[620,930,931],{},[280,932,933],{},"api\u002Froutes\u002F",[620,935,936,937,513,940,943,944,513,947,513,950,513,953,513,956,959,960,513,963,513,966,513,969,513,972,513,975,293],{},"One module per resource: ",[280,938,939],{},"work_items",[280,941,942],{},"lifecycle"," (pause, resume, retry, skip, abandon, complete, cancel, escalate), ",[280,945,946],{},"gates",[280,948,949],{},"review",[280,951,952],{},"board",[280,954,955],{},"artifacts",[280,957,958],{},"sessions"," (logs, permission requests, the WebSocket), ",[280,961,962],{},"repos",[280,964,965],{},"settings",[280,967,968],{},"harnesses",[280,970,971],{},"search",[280,973,974],{},"auth",[280,976,977],{},"check",[605,979,980,985],{},[620,981,982],{},[280,983,984],{},"api\u002Fconfig_check.py",[620,986,987],{},"Checks a config file the way saving it would.",[605,989,990,995],{},[620,991,992],{},[280,993,994],{},"ws.py",[620,996,997],{},"Fans committed events out to WebSocket clients.",[605,999,1000,1005],{},[620,1001,1002],{},[280,1003,1004],{},"render.py",[620,1006,1007],{},"Terminal formatting for the CLI.",[803,1009,1011],{"id":1010},"running-a-chain","Running a chain",[599,1013,1014,1022],{},[602,1015,1016],{},[605,1017,1018,1020],{},[608,1019,815],{},[608,1021,818],{},[615,1023,1024,1033,1042,1051,1060,1072,1082,1098,1108,1122,1136,1150,1159,1168,1181,1194,1208,1218,1228,1238,1248,1258,1268,1278],{},[605,1025,1026,1030],{},[620,1027,1028],{},[280,1029,454],{},[620,1031,1032],{},"Intake, attachments, and closing beads when an item completes.",[605,1034,1035,1039],{},[620,1036,1037],{},[280,1038,496],{},[620,1040,1041],{},"The walk: node by node, with recovery, the fix loop, escalation and every stop.",[605,1043,1044,1048],{},[620,1045,1046],{},[280,1047,504],{},[620,1049,1050],{},"Runs a node's steps and tasks, measures the result, collects findings, and asks the fix-loop judge.",[605,1052,1053,1057],{},[620,1054,1055],{},[280,1056,527],{},[620,1058,1059],{},"Opening gates, approval and rejection, agent gate review, and automatic escalation of stuck stops.",[605,1061,1062,1066],{},[620,1063,1064],{},[280,1065,778],{},[620,1067,1068,1069,1071],{},"Writes each kind of stop, and guards every claim so an ",[280,1070,486],{}," item always has a walk behind it.",[605,1073,1074,1079],{},[620,1075,1076],{},[280,1077,1078],{},"executor\u002Fresuming.py",[620,1080,1081],{},"Resuming after a restart, and addressing a steer to paused tasks.",[605,1083,1084,1095],{},[620,1085,1086,513,1089,513,1092],{},[280,1087,1088],{},"executor\u002Fretry.py",[280,1090,1091],{},"store\u002Fforks.py",[280,1093,1094],{},"templates\u002Fforks.py",[620,1096,1097],{},"A retry forks the run at a task, step or node path.",[605,1099,1100,1105],{},[620,1101,1102],{},[280,1103,1104],{},"executor\u002Fprompts.py",[620,1106,1107],{},"The text Kraft adds to an agent's prompt: steers, failures, findings, review threads, progress.",[605,1109,1110,1115],{},[620,1111,1112],{},[280,1113,1114],{},"executor\u002Fcontext.py",[620,1116,1117,1118,1121],{},"Walk results and the ",[280,1119,1120],{},"Steer"," object.",[605,1123,1124,1129],{},[620,1125,1126],{},[280,1127,1128],{},"executor\u002Ffallback.py",[620,1130,1131,1132,1135],{},"Moving a rate-limited or unavailable agent task to its next ",[280,1133,1134],{},"fallback:"," entry.",[605,1137,1138,1143],{},[620,1139,1140],{},[280,1141,1142],{},"executor\u002Fread_only.py",[620,1144,1145,1146,1149],{},"Checks that a ",[280,1147,1148],{},"read_only"," step changed nothing.",[605,1151,1152,1156],{},[620,1153,1154],{},[280,1155,500],{},[620,1157,1158],{},"Work Kraft does itself: the worktree, setup, rebases, changed-test scopes.",[605,1160,1161,1165],{},[620,1162,1163],{},[280,1164,562],{},[620,1166,1167],{},"External waits and the scheduler that re-enters them.",[605,1169,1170,1175],{},[620,1171,1172],{},[280,1173,1174],{},"rate_limit_retry.py",[620,1176,1177,1178,1180],{},"Re-enters a ",[280,1179,377],{}," item after its reset.",[605,1182,1183,1191],{},[620,1184,1185,513,1188],{},[280,1186,1187],{},"caps.py",[280,1189,1190],{},"cap_levels.py",[620,1192,1193],{},"Time caps per scope, and the poller that stops parked items.",[605,1195,1196,1201],{},[620,1197,1198],{},[280,1199,1200],{},"policy.py",[620,1202,1203,1204,1207],{},"Loads ",[280,1205,1206],{},"policy.yaml",": loops, caps, budget, triggers, escalation settings.",[605,1209,1210,1215],{},[620,1211,1212],{},[280,1213,1214],{},"findings.py",[620,1216,1217],{},"The finding schema reviewers report, and its identity across rounds.",[605,1219,1220,1225],{},[620,1221,1222],{},[280,1223,1224],{},"escalate.py",[620,1226,1227],{},"Escalation turns: the agent a stopped item hands to.",[605,1229,1230,1235],{},[620,1231,1232],{},[280,1233,1234],{},"auto_escalate_delay.py",[620,1236,1237],{},"Fires a delayed automatic escalation.",[605,1239,1240,1245],{},[620,1241,1242],{},[280,1243,1244],{},"gate_review.py",[620,1246,1247],{},"An agent reviewing a gate before a person sees it.",[605,1249,1250,1255],{},[620,1251,1252],{},[280,1253,1254],{},"review.py",[620,1256,1257],{},"The one producer of \"what changed\" for the gate viewer and review agents.",[605,1259,1260,1265],{},[620,1261,1262],{},[280,1263,1264],{},"review_reply.py",[620,1266,1267],{},"The agent that answers review threads.",[605,1269,1270,1275],{},[620,1271,1272],{},[280,1273,1274],{},"node_runs.py",[620,1276,1277],{},"Pins the commit each node run started and ended on.",[605,1279,1280,1285],{},[620,1281,1282],{},[280,1283,1284],{},"progress.py",[620,1286,1287,1288,1291],{},"Reads a plan's ",[280,1289,1290],{},"## Task N"," headings for \"Task 3 of 6\".",[803,1293,1295],{"id":1294},"templates","Templates",[599,1297,1298,1306],{},[602,1299,1300],{},[605,1301,1302,1304],{},[608,1303,815],{},[608,1305,818],{},[615,1307,1308,1318,1331,1341,1351,1361,1374,1384],{},[605,1309,1310,1315],{},[620,1311,1312],{},[280,1313,1314],{},"templates\u002Fmodels.py",[620,1316,1317],{},"The typed chain schema: tasks, steps, nodes, chains, canonical paths.",[605,1319,1320,1325],{},[620,1321,1322],{},[280,1323,1324],{},"templates\u002Flibrary.py",[620,1326,1327,1328,293],{},"Loads the template directory and resolves ",[280,1329,1330],{},"extends",[605,1332,1333,1338],{},[620,1334,1335],{},[280,1336,1337],{},"templates\u002Fenvironment.py",[620,1339,1340],{},"Workspaces, areas, targets and harness profiles a chain runs against.",[605,1342,1343,1348],{},[620,1344,1345],{},[280,1346,1347],{},"templates\u002Frevision.py",[620,1349,1350],{},"Plan-driven chain revision.",[605,1352,1353,1358],{},[620,1354,1355],{},[280,1356,1357],{},"templates\u002Fretry.py",[620,1359,1360],{},"Policy-bounded overrides a retry may carry.",[605,1362,1363,1371],{},[620,1364,1365,513,1368],{},[280,1366,1367],{},"templates\u002Fcatalogue.py",[280,1369,1370],{},"templates\u002Fpositions.py",[620,1372,1373],{},"The library as a list for the UI, and YAML positions for editor errors.",[605,1375,1376,1381],{},[620,1377,1378],{},[280,1379,1380],{},"overrides.py",[620,1382,1383],{},"Validates per-item model and per-node overrides.",[605,1385,1386,1394],{},[620,1387,1388,513,1391],{},[280,1389,1390],{},"skill.py",[280,1392,1393],{},"skills\u002F",[620,1395,1396],{},"The method an agent follows (spec, plan, code review, and so on), injected through its system prompt.",[803,1398,1400],{"id":1399},"agents-and-workers","Agents and workers",[599,1402,1403,1411],{},[602,1404,1405],{},[605,1406,1407,1409],{},[608,1408,815],{},[608,1410,818],{},[615,1412,1413,1424,1436,1445,1455,1474,1487,1500,1509,1519,1531,1550,1559],{},[605,1414,1415,1421],{},[620,1416,1417,513,1419],{},[280,1418,512],{},[280,1420,516],{},[620,1422,1423],{},"A harness: how to launch one agent CLI, described as data.",[605,1425,1426,1433],{},[620,1427,1428,513,1430],{},[280,1429,508],{},[280,1431,1432],{},"adapters\u002Fprofiles.py",[620,1434,1435],{},"Resolve an agent task to a harness and profile, and build its command line and context.",[605,1437,1438,1442],{},[620,1439,1440],{},[280,1441,520],{},[620,1443,1444],{},"Launch a session, watch its log, read its result file, settle its status.",[605,1446,1447,1452],{},[620,1448,1449],{},[280,1450,1451],{},"adapters\u002Fartifact_notes.py",[620,1453,1454],{},"What each document kind is for, in the prompt.",[605,1456,1457,1471],{},[620,1458,1459,513,1462,513,1464,513,1466,513,1468],{},[280,1460,1461],{},"adapters\u002Fhook_install.py",[280,1463,649],{},[280,1465,652],{},[280,1467,655],{},[280,1469,1470],{},"registration.py",[620,1472,1473],{},"The permission gate across harnesses: hook install, tool policy written into each CLI's config, named grants, and the permission tool's name.",[605,1475,1476,1484],{},[620,1477,1478,513,1481],{},[280,1479,1480],{},"usage.py",[280,1482,1483],{},"logs.py",[620,1485,1486],{},"Token, cost and time per session, and reading a session's log.",[605,1488,1489,1497],{},[620,1490,1491,513,1494],{},[280,1492,1493],{},"worker\u002Fenv.py",[280,1495,1496],{},"worker\u002Fsteering.py",[620,1498,1499],{},"A worker's environment, and the standards injected into its prompt.",[605,1501,1502,1506],{},[620,1503,1504],{},[280,1505,585],{},[620,1507,1508],{},"Adopting sessions that survived a restart.",[605,1510,1511,1516],{},[620,1512,1513],{},[280,1514,1515],{},"worker\u002Fworktree_read.py",[620,1517,1518],{},"Reading a file an agent wrote, safely.",[605,1520,1521,1528],{},[620,1522,1523,513,1526],{},[280,1524,1525],{},"worker\u002Fbackends\u002F",[280,1527,686],{},[620,1529,1530],{},"Sandboxed sessions in Docker or Podman, and host git hardening.",[605,1532,1533,1547],{},[620,1534,1535,513,1537,513,1539,513,1542,513,1544],{},[280,1536,703],{},[280,1538,706],{},[280,1540,1541],{},"worker\u002Fca.py",[280,1543,710],{},[280,1545,1546],{},"worker\u002Fcallback.py",[620,1548,1549],{},"The egress proxy for sandboxed sessions: per-session channels, its CA, injected credentials, and what a worker's callbacks may reach.",[605,1551,1552,1556],{},[620,1553,1554],{},[280,1555,689],{},[620,1557,1558],{},"A sandboxed worker's private ref store.",[605,1560,1561,1572],{},[620,1562,1563,513,1566,513,1569],{},[280,1564,1565],{},"worker\u002Fsession_mcp.py",[280,1567,1568],{},"worker\u002Fshim.py",[280,1570,1571],{},"worker\u002Fbin\u002Fkraft",[620,1573,1574,1575,1577],{},"The MCP server and ",[280,1576,319],{}," shim a sandboxed worker calls back through.",[803,1579,1581],{"id":1580},"forge-and-trackers","Forge and trackers",[599,1583,1584,1592],{},[602,1585,1586],{},[605,1587,1588,1590],{},[608,1589,815],{},[608,1591,818],{},[615,1593,1594,1604,1622,1640,1650,1668],{},[605,1595,1596,1601],{},[620,1597,1598],{},[280,1599,1600],{},"adapters\u002Fforge\u002Frun.py",[620,1602,1603],{},"Picks the backend and runs a forge node against one or several repos.",[605,1605,1606,1614],{},[620,1607,1608,513,1611],{},[280,1609,1610],{},"adapters\u002Fforge\u002Fgh.py",[280,1612,1613],{},"adapters\u002Fforge\u002Fglab.py",[620,1615,1616,1617,1619,1620,293],{},"GitHub through ",[280,1618,415],{},", GitLab through ",[280,1621,419],{},[605,1623,1624,1637],{},[620,1625,1626,513,1628,513,1631,513,1634],{},[280,1627,695],{},[280,1629,1630],{},"adapters\u002Fforge\u002Fmr.py",[280,1632,1633],{},"adapters\u002Fforge\u002Fci.py",[280,1635,1636],{},"adapters\u002Fforge\u002Fmodels.py",[620,1638,1639],{},"Local git, the merge request's title and body, reading a pipeline, and the shared types.",[605,1641,1642,1647],{},[620,1643,1644],{},[280,1645,1646],{},"automated_review.py",[620,1648,1649],{},"Which automated reviewer a repo expects.",[605,1651,1652,1660],{},[620,1653,1654,513,1657],{},[280,1655,1656],{},"adapters\u002Fbeads.py",[280,1658,1659],{},"intake.py",[620,1661,1662,1664,1665,293],{},[280,1663,423],{}," calls, and auto-intake from ",[280,1666,1667],{},"bd ready",[605,1669,1670,1675],{},[620,1671,1672],{},[280,1673,1674],{},"triggers.py",[620,1676,1677,1678,293],{},"Cron triggers from ",[280,1679,1206],{},[803,1681,1683],{"id":1682},"state-and-configuration","State and configuration",[599,1685,1686,1694],{},[602,1687,1688],{},[605,1689,1690,1692],{},[608,1691,815],{},[608,1693,818],{},[615,1695,1696,1709,1722,1759,1774,1787,1797,1807,1817,1827,1836,1845,1869],{},[605,1697,1698,1703],{},[620,1699,1700],{},[280,1701,1702],{},"db.py",[620,1704,1705,1706,293],{},"The schema, its migrations, and the single-writer ",[280,1707,1708],{},"Database",[605,1710,1711,1716],{},[620,1712,1713],{},[280,1714,1715],{},"events.py",[620,1717,1718,1719,1721],{},"Appending to and reading the ",[280,1720,390],{}," table.",[605,1723,1724,1729],{},[620,1725,1726],{},[280,1727,1728],{},"store\u002F",[620,1730,1731,1732,513,1734,513,1737,513,1739,513,1741,513,1744,513,1747,513,1749,513,1751,1754,1755,1758],{},"Every query, by table: ",[280,1733,939],{},[280,1735,1736],{},"chain",[280,1738,946],{},[280,1740,958],{},[280,1742,1743],{},"counters",[280,1745,1746],{},"budget",[280,1748,949],{},[280,1750,962],{},[280,1752,1753],{},"forks",". ",[280,1756,1757],{},"_common.py"," holds the rule that an ended item never becomes runnable.",[605,1760,1761,1766],{},[620,1762,1763],{},[280,1764,1765],{},"paths.py",[620,1767,1768,753,1771,1773],{},[280,1769,1770],{},"$KRAFT_HOME",[280,1772,635],{}," layout.",[605,1775,1776,1784],{},[620,1777,1778,513,1781],{},[280,1779,1780],{},"config.py",[280,1782,1783],{},"config_schemas.py",[620,1785,1786],{},"Reading and writing the YAML files, and their JSON Schemas for editors.",[605,1788,1789,1794],{},[620,1790,1791],{},[280,1792,1793],{},"capabilities.py",[620,1795,1796],{},"What this version can do that an older seeded config cannot.",[605,1798,1799,1804],{},[620,1800,1801],{},[280,1802,1803],{},"index\u002F",[620,1805,1806],{},"The search index: chunking, local embeddings, ingest, and the query service.",[605,1808,1809,1814],{},[620,1810,1811],{},[280,1812,1813],{},"analytics.py",[620,1815,1816],{},"The numbers behind the Analytics view.",[605,1818,1819,1824],{},[620,1820,1821],{},[280,1822,1823],{},"archive.py",[620,1825,1826],{},"Auto-archive of old ended items.",[605,1828,1829,1833],{},[620,1830,1831],{},[280,1832,539],{},[620,1834,1835],{},"Outbound notifications.",[605,1837,1838,1842],{},[620,1839,1840],{},[280,1841,631],{},[620,1843,1844],{},"Password login and sessions for off-localhost access.",[605,1846,1847,1858],{},[620,1848,1849,513,1852,513,1855],{},[280,1850,1851],{},"doctor.py",[280,1853,1854],{},"update.py",[280,1856,1857],{},"init.py",[620,1859,1860,513,1863,707,1866,293],{},[280,1861,1862],{},"kraft admin doctor",[280,1864,1865],{},"update",[280,1867,1868],{},"init",[605,1870,1871,1876],{},[620,1872,1873],{},[280,1874,1875],{},"intent.py",[620,1877,1878,1879,1882],{},"Checks the intent tree in ",[280,1880,1881],{},"docs\u002Fintent\u002F"," (a CI check, not part of the server).",[276,1884,1885,1886,1888,1889,476,1892,1895,1896,1898,1899,1902,1903,1906,1907,293],{},"Outside ",[280,1887,282],{},": the SPA is in ",[280,1890,1891],{},"frontend\u002Fsrc\u002F",[280,1893,1894],{},"views\u002F"," per screen),\nthe packaged default templates are in ",[280,1897,458],{},", the agent plugins are in\n",[280,1900,1901],{},"plugins\u002F",", the VS Code extension is in ",[280,1904,1905],{},"vscode\u002F",", and contributor scripts are\nin ",[280,1908,1909],{},"dev\u002F",[295,1911,1913],{"id":1912},"where-to-change-things","Where to change things",[599,1915,1916,1926],{},[602,1917,1918],{},[605,1919,1920,1923],{},[608,1921,1922],{},"To",[608,1924,1925],{},"Change",[615,1927,1928,1956,1974,1989,2008,2029,2046,2060,2083,2099,2112,2123,2143,2155],{},[605,1929,1930,1933],{},[620,1931,1932],{},"Add a CLI verb or MCP tool",[620,1934,1935,1936,374,1939,1942,1943,374,1946,1949,1950,1952,1953,293],{},"A function in ",[280,1937,1938],{},"client\u002Factions.py",[280,1940,1941],{},"client\u002Freads.py",", its verb in ",[280,1944,1945],{},"cli\u002Fitem.py",[280,1947,1948],{},"cli\u002Fview.py",", its tool in ",[280,1951,879],{},", and ",[288,1954,1955],{"href":119},"the CLI reference",[605,1957,1958,1961],{},[620,1959,1960],{},"Add an API route",[620,1962,1963,1964,1967,1968,1971,1972,293],{},"A handler on ",[280,1965,1966],{},"api_router"," in the matching ",[280,1969,1970],{},"api\u002Froutes\u002F*.py",". A new module is imported in ",[280,1973,891],{},[605,1975,1976,1979],{},[620,1977,1978],{},"Add a harness",[620,1980,1981,1982,1985,1986,293],{},"A YAML file in ",[280,1983,1984],{},"harnesses\u002F",". See ",[288,1987,1988],{"href":72},"Adding a harness",[605,1990,1991,1994],{},[620,1992,1993],{},"Add a builtin action",[620,1995,1996,1997,664,2000,2002,2003,2005,2006,293],{},"A member of ",[280,1998,1999],{},"BuiltinAction",[280,2001,1314],{},", its branch in ",[280,2004,504],{},", and the work in ",[280,2007,500],{},[605,2009,2010,2013],{},[620,2011,2012],{},"Add a forge action or backend",[620,2014,2015,664,2018,707,2020,2022,2023,707,2026,293],{},[280,2016,2017],{},"ForgeAction",[280,2019,1314],{},[280,2021,1600],{},"; a backend beside ",[280,2024,2025],{},"gh.py",[280,2027,2028],{},"glab.py",[605,2030,2031,2034],{},[620,2032,2033],{},"Change a shipped chain or library component",[620,2035,2036,707,2039,2042,2043,293],{},[280,2037,2038],{},"templates\u002Fchains\u002F*.yaml",[280,2040,2041],{},"templates\u002Flibrary.yaml"," at the repo root. Run ",[280,2044,2045],{},"kraft admin templates lint",[605,2047,2048,2051],{},[620,2049,2050],{},"Change what an agent is told",[620,2052,2053,2054,2057,2058,293],{},"The skill in ",[280,2055,2056],{},"skills\u002F\u003Cname>\u002FSKILL.md",", or Kraft's own notes in ",[280,2059,1104],{},[605,2061,2062,2068],{},[620,2063,2064,2065,2067],{},"Add a ",[280,2066,1206],{}," key",[620,2069,2070,707,2073,664,2075,2077,2078,1952,2081,293],{},[280,2071,2072],{},"PolicyInput",[280,2074,156],{},[280,2076,1200],{},", the default in ",[280,2079,2080],{},"templates\u002Fpolicy.yaml",[288,2082,156],{"href":157},[605,2084,2085,2090],{},[620,2086,2064,2087,2067],{},[280,2088,2089],{},"repos.yaml",[620,2091,2092,664,2095,1952,2097,293],{},[280,2093,2094],{},"RepoEntry",[280,2096,1780],{},[288,2098,146],{"href":147},[605,2100,2101,2104],{},[620,2102,2103],{},"Change the database",[620,2105,2106,2107,2109,2110,293],{},"A new numbered migration in ",[280,2108,1702],{},", and the queries in ",[280,2111,1728],{},[605,2113,2114,2117],{},[620,2115,2116],{},"Change how a stop is handled",[620,2118,2119,707,2121,293],{},[280,2120,496],{},[280,2122,778],{},[605,2124,2125,2128],{},[620,2126,2127],{},"Add a status transition",[620,2129,2130,2131,2133,2134,664,2137,2140,2141,293],{},"The write in ",[280,2132,1728],{},", through ",[280,2135,2136],{},"write_status",[280,2138,2139],{},"store\u002F_common.py",", and the door in ",[280,2142,479],{},[605,2144,2145,2151],{},[620,2146,2064,2147,2150],{},[280,2148,2149],{},"doctor"," check",[620,2152,2153,293],{},[280,2154,1851],{},[605,2156,2157,2160],{},[620,2158,2159],{},"Change a screen",[620,2161,2162,293],{},[280,2163,2164],{},"frontend\u002Fsrc\u002Fviews\u002F",[276,2166,2167,2168,293],{},"Before a pull request, see ",[288,2169,255],{"href":256},[295,2171,2173],{"id":2172},"state-on-disk","State on disk",[276,2175,2176,2177,2179,2180,451,2183,2185,2186,2188,2189,2191,2192,2194],{},"State lives in ",[280,2178,1770],{}," (default ",[280,2181,2182],{},"~\u002F.kraft",[280,2184,635],{}," holds the databases,\nsession logs and result files, worktrees, attachment copies, the process id\nfile, and the sandbox's sockets and CA. ",[280,2187,458],{}," holds the YAML the\nSettings screens edit. ",[280,2190,458],{}," is seeded from the packaged defaults on\nfirst run and never overwritten after, so an upgrade cannot clobber an edited\npolicy. See ",[288,2193,140],{"href":141}," for what's in those\nfiles.",{"title":2196,"searchDepth":2197,"depth":2197,"links":2198},"",2,[2199,2200,2201,2202,2211,2212],{"id":297,"depth":2197,"text":298},{"id":427,"depth":2197,"text":428},{"id":589,"depth":2197,"text":590},{"id":795,"depth":2197,"text":796,"children":2203},[2204,2206,2207,2208,2209,2210],{"id":805,"depth":2205,"text":806},3,{"id":1010,"depth":2205,"text":1011},{"id":1294,"depth":2205,"text":1295},{"id":1399,"depth":2205,"text":1400},{"id":1580,"depth":2205,"text":1581},{"id":1682,"depth":2205,"text":1683},{"id":1912,"depth":2197,"text":1913},{"id":2172,"depth":2197,"text":2173},"One FastAPI process, the executor inside it, the worker sessions it spawns, and a map of src\u002Fkraft\u002F for contributors.","md",null,{},true,{"title":251,"description":2213},"LnfhWjK4o92_7Fk21W1jne6RGjb053U6C5GmVy-gG9U",[2221,2223],{"title":10,"path":245,"stem":249,"description":2222,"children":-1},"Architecture, contributing, and security.",{"title":255,"path":256,"stem":257,"description":2224,"children":-1},"Where to find the contributor guide and the release process.",1790824508227]