[{"data":1,"prerenderedAt":2342},["ShallowReactive",2],{"navigation_docs":3,"-reference-http-api":270,"-reference-http-api-surround":2337},[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":232,"body":272,"description":2330,"extension":2331,"links":2332,"meta":2333,"navigation":2334,"path":233,"seo":2335,"stem":234,"__hash__":2336},"docs\u002F4.reference\u002F7.http-api.md",{"type":273,"value":274,"toc":2319},"minimark",[275,288,293,302,371,389,438,442,456,542,604,608,626,916,930,951,955,975,985,1046,1058,1064,1137,1167,1279,1293,1297,1321,1351,1355,1364,1399,1432,1455,1760,1817,1821,1868,1877,1969,1985,2020,2085,2133,2137,2140,2184,2217,2228,2232,2295,2315],[276,277,278,279,283,284,287],"p",{},"The Kraft server serves its board, and the JSON API behind it, on one port\n(",[280,281,282],"code",{},"127.0.0.1:8765"," by default). The ",[280,285,286],{},"kraft"," command and the MCP server are\nclients of that API.",[289,290,292],"h2",{"id":291},"stable-routes","Stable routes",[276,294,295,296,301],{},"Only two routes are meant for other programs, and only these keep their shape\nbetween minor releases. See\n",[297,298,300],"a",{"href":299},"\u002Fproject\u002Fstatus-and-support#versioning-and-stability","Versioning and stability",".",[303,304,305,318],"table",{},[306,307,308],"thead",{},[309,310,311,315],"tr",{},[312,313,314],"th",{},"Route",[312,316,317],{},"Use",[319,320,321,335],"tbody",{},[309,322,323,329],{},[324,325,326],"td",{},[280,327,328],{},"POST \u002Fapi\u002Ftriggers",[324,330,331,332,301],{},"File a work item from a webhook or script. See ",[297,333,228],{"href":334},"\u002Freference\u002Ftriggers#post-apitriggers",[309,336,337,342],{},[324,338,339],{},[280,340,341],{},"GET \u002Fapi\u002Fhealth",[324,343,344,345,348,349,352,353,356,357,360,361,360,364,360,367,370],{},"Check that the server is up. Answers ",[280,346,347],{},"status"," (",[280,350,351],{},"ok"," or ",[280,354,355],{},"degraded","), the reasons it is degraded, and which instance this is (",[280,358,359],{},"run_dir",", ",[280,362,363],{},"pid",[280,365,366],{},"bind",[280,368,369],{},"port","). Needs no login.",[276,372,373,374,377,378,381,382,384,385,388],{},"Every other route under ",[280,375,376],{},"\u002Fapi\u002F",", and the ",[280,379,380],{},"\u002Fapi\u002Fws\u002Fevents"," WebSocket, exists\nfor the board and can change in any release. For those, prefer the ",[280,383,286],{},"\ncommand with ",[280,386,387],{},"--json",", which is stable.",[276,390,391,394,395,398,399,402,403,406,407,410,411,414,415,360,418,420,421,423,424,427,428,352,431,434,435,301],{},[280,392,393],{},"POST \u002Fapi\u002Fwork-items",", the board's create route, files the item paused unless\nthe body sets ",[280,396,397],{},"autostart: true",", like ",[280,400,401],{},"kraft item create"," without\n",[280,404,405],{},"--autostart",". A body with no ",[280,408,409],{},"chain_template"," gets the repo's\n",[280,412,413],{},"default_chain_template",". Every repo path you send must be absolute: the\nserver would read a relative one against its own directory, not yours.\n",[280,416,417],{},"POST \u002Fapi\u002Frepos",[280,419,393],{}," and ",[280,422,328],{}," refuse it\nwith a ",[280,425,426],{},"422",", and ",[280,429,430],{},"PATCH",[280,432,433],{},"DELETE \u002Fapi\u002Frepos?path="," answer ",[280,436,437],{},"404",[289,439,441],{"id":440},"work-item-status","Work item status",[276,443,444,420,447,450,451,455],{},[280,445,446],{},"GET \u002Fwork-items",[280,448,449],{},"GET \u002Fwork-items\u002F{id}"," both carry two read-only fields\non every item, computed on read rather than stored (see\n",[297,452,454],{"href":453},"\u002Fconcepts\u002Fhow-a-work-item-runs#displayed-status","Displayed status","):",[303,457,458,468],{},[306,459,460],{},[309,461,462,465],{},[312,463,464],{},"Field",[312,466,467],{},"Meaning",[319,469,470,507],{},[309,471,472,477],{},[324,473,474],{},[280,475,476],{},"display_status",[324,478,479,480,360,483,360,486,360,489,360,492,360,495,360,498,360,501,360,504,301],{},"The board's status badge: one of ",[280,481,482],{},"archived",[280,484,485],{},"done",[280,487,488],{},"cancelled",[280,490,491],{},"paused",[280,493,494],{},"running",[280,496,497],{},"waiting",[280,499,500],{},"needs_you",[280,502,503],{},"escalated",[280,505,506],{},"failed",[309,508,509,514],{},[324,510,511],{},[280,512,513],{},"stop",[324,515,516,519,520,360,523,352,525,528,529,532,533,360,536,420,539,301],{},[280,517,518],{},"null"," unless the item is ",[280,521,522],{},"needs_human",[280,524,497],{},[280,526,527],{},"rate_limited",". On the list, ",[280,530,531],{},"{kind, node, resume_at, reason}","; on the detail, also ",[280,534,535],{},"task",[280,537,538],{},"attempt",[280,540,541],{},"facts",[276,543,544,547,548,360,551,360,554,360,557,360,560,562,563,360,566,360,569,360,572,360,575,360,578,360,581,584,585,589,590,592,593,595,596,599,600,603],{},[280,545,546],{},"stop.kind"," is one of ",[280,549,550],{},"gate",[280,552,553],{},"question",[280,555,556],{},"cap",[280,558,559],{},"budget",[280,561,506],{},",\n",[280,564,565],{},"conflict",[280,567,568],{},"mr_closed",[280,570,571],{},"config",[280,573,574],{},"infra",[280,576,577],{},"stuck",[280,579,580],{},"wait",[280,582,583],{},"rate_limit"," (see\n",[297,586,588],{"href":587},"\u002Freference\u002Fevents#work_item_needs_human","Events → work_item_needs_human"," for\nwhat each means). A ",[280,591,583],{}," stop's ",[280,594,541],{}," also carries ",[280,597,598],{},"fallback"," and\n",[280,601,602],{},"fallback_allowed"," -- the stopped task's declared fallback harnesses, and\nwhich of those its resolved policy still allows.",[289,605,607],{"id":606},"cancelling","Cancelling",[276,609,610,613,614,617,618,621,622,625],{},[280,611,612],{},"GET \u002Fwork-items\u002F{id}\u002Fcancel-preview"," shows what ",[280,615,616],{},"POST \u002Fwork-items\u002F{id}\u002Fcancel","\nwould do, without doing it: ",[280,619,620],{},"409"," once the item has already ended, same as\n",[280,623,624],{},"\u002Fcancel"," itself.",[627,628,633],"pre",{"className":629,"code":630,"language":631,"meta":632,"style":632},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"running\": {\"node\": \"mr_checks\", \"task\": \"mr_checks\", \"attempt\": 1} | null,\n  \"kept\": {\"branch\": \"kraft\u002F...\", \"worktree\": \"\u002Fpath\", \"findings\": 0, \"threads\": 1},\n  \"mr\": {\"ref\": 54, \"url\": \"https:\u002F\u002F...\", \"state\": \"open\"} | null,\n  \"spend\": {\"spent_usd\": 1.2, \"cap_usd\": 5.0}\n}\n","json","",[280,634,635,644,722,800,868,911],{"__ignoreMap":632},[636,637,640],"span",{"class":638,"line":639},"line",1,[636,641,643],{"class":642},"sMK4o","{\n",[636,645,647,650,653,656,659,662,664,668,670,672,675,679,681,684,686,688,690,692,694,696,698,700,702,704,706,708,712,715,719],{"class":638,"line":646},2,[636,648,649],{"class":642},"  \"",[636,651,494],{"class":652},"spNyl",[636,654,655],{"class":642},"\"",[636,657,658],{"class":642},":",[636,660,661],{"class":642}," {",[636,663,655],{"class":642},[636,665,667],{"class":666},"sBMFI","node",[636,669,655],{"class":642},[636,671,658],{"class":642},[636,673,674],{"class":642}," \"",[636,676,678],{"class":677},"sfazB","mr_checks",[636,680,655],{"class":642},[636,682,683],{"class":642},",",[636,685,674],{"class":642},[636,687,535],{"class":666},[636,689,655],{"class":642},[636,691,658],{"class":642},[636,693,674],{"class":642},[636,695,678],{"class":677},[636,697,655],{"class":642},[636,699,683],{"class":642},[636,701,674],{"class":642},[636,703,538],{"class":666},[636,705,655],{"class":642},[636,707,658],{"class":642},[636,709,711],{"class":710},"sbssI"," 1",[636,713,714],{"class":642},"}",[636,716,718],{"class":717},"sTEyZ"," | ",[636,720,721],{"class":642},"null,\n",[636,723,725,727,730,732,734,736,738,741,743,745,747,750,752,754,756,759,761,763,765,768,770,772,774,777,779,781,784,786,788,791,793,795,797],{"class":638,"line":724},3,[636,726,649],{"class":642},[636,728,729],{"class":652},"kept",[636,731,655],{"class":642},[636,733,658],{"class":642},[636,735,661],{"class":642},[636,737,655],{"class":642},[636,739,740],{"class":666},"branch",[636,742,655],{"class":642},[636,744,658],{"class":642},[636,746,674],{"class":642},[636,748,749],{"class":677},"kraft\u002F...",[636,751,655],{"class":642},[636,753,683],{"class":642},[636,755,674],{"class":642},[636,757,758],{"class":666},"worktree",[636,760,655],{"class":642},[636,762,658],{"class":642},[636,764,674],{"class":642},[636,766,767],{"class":677},"\u002Fpath",[636,769,655],{"class":642},[636,771,683],{"class":642},[636,773,674],{"class":642},[636,775,776],{"class":666},"findings",[636,778,655],{"class":642},[636,780,658],{"class":642},[636,782,783],{"class":710}," 0",[636,785,683],{"class":642},[636,787,674],{"class":642},[636,789,790],{"class":666},"threads",[636,792,655],{"class":642},[636,794,658],{"class":642},[636,796,711],{"class":710},[636,798,799],{"class":642},"},\n",[636,801,803,805,808,810,812,814,816,819,821,823,826,828,830,833,835,837,839,842,844,846,848,851,853,855,857,860,862,864,866],{"class":638,"line":802},4,[636,804,649],{"class":642},[636,806,807],{"class":652},"mr",[636,809,655],{"class":642},[636,811,658],{"class":642},[636,813,661],{"class":642},[636,815,655],{"class":642},[636,817,818],{"class":666},"ref",[636,820,655],{"class":642},[636,822,658],{"class":642},[636,824,825],{"class":710}," 54",[636,827,683],{"class":642},[636,829,674],{"class":642},[636,831,832],{"class":666},"url",[636,834,655],{"class":642},[636,836,658],{"class":642},[636,838,674],{"class":642},[636,840,841],{"class":677},"https:\u002F\u002F...",[636,843,655],{"class":642},[636,845,683],{"class":642},[636,847,674],{"class":642},[636,849,850],{"class":666},"state",[636,852,655],{"class":642},[636,854,658],{"class":642},[636,856,674],{"class":642},[636,858,859],{"class":677},"open",[636,861,655],{"class":642},[636,863,714],{"class":642},[636,865,718],{"class":717},[636,867,721],{"class":642},[636,869,871,873,876,878,880,882,884,887,889,891,894,896,898,901,903,905,908],{"class":638,"line":870},5,[636,872,649],{"class":642},[636,874,875],{"class":652},"spend",[636,877,655],{"class":642},[636,879,658],{"class":642},[636,881,661],{"class":642},[636,883,655],{"class":642},[636,885,886],{"class":666},"spent_usd",[636,888,655],{"class":642},[636,890,658],{"class":642},[636,892,893],{"class":710}," 1.2",[636,895,683],{"class":642},[636,897,674],{"class":642},[636,899,900],{"class":666},"cap_usd",[636,902,655],{"class":642},[636,904,658],{"class":642},[636,906,907],{"class":710}," 5.0",[636,909,910],{"class":642},"}\n",[636,912,914],{"class":638,"line":913},6,[636,915,910],{"class":642},[276,917,918,920,921,923,924,926,927,929],{},[280,919,494],{}," is the item's running session, if any; ",[280,922,729],{}," is what cancel leaves\nbehind (cancel never removes the worktree or the branch); ",[280,925,807],{}," is the item's\nmerge request and its live state, or ",[280,928,518],{}," before one was ever opened.",[276,931,932,934,935,938,939,942,943,946,947,950],{},[280,933,616],{}," takes an optional ",[280,936,937],{},"close_mr: bool = false",".\nWhen set and the item's merge request is open, cancel closes it on the forge\nonce the cancel itself has landed and the response gains ",[280,940,941],{},"close_mr: {ok: true}"," (or ",[280,944,945],{},"{ok: false, error}"," when there was no open merge request or the\nforge call failed -- a failed close never undoes the cancel). The key is\nabsent when ",[280,948,949],{},"close_mr"," was not asked for.",[289,952,954],{"id":953},"retrying-duplicating-acting-in-bulk","Retrying, duplicating, acting in bulk",[276,956,957,960,961,963,964,967,968,970,971,974],{},[280,958,959],{},"POST \u002Fwork-items\u002F{id}\u002Fretry","'s response gains ",[280,962,538],{},": the attempt number\nthe task it relaunches will run as -- the count of that (item, node, task)'s\nown sessions so far, plus one. A ",[280,965,966],{},"path"," naming one task counts only that\ntask's sessions; a ",[280,969,966],{},"-less retry (the whole stopped node, or ",[280,972,973],{},"restart","'s\nwhole chain) takes the highest next-attempt over all of the node's own tasks,\nsince a walk may enter at any one of them.",[276,976,977,980,981,984],{},[280,978,979],{},"POST \u002Fwork-items\u002F{id}\u002Fduplicate"," files a fresh, paused item from ",[280,982,983],{},"{id}","'s own\ntitle, description, repo, chain template, workspace selection and\nattachments (re-snapshotted under the new item's own id). Any source status is\naccepted, archived and cancelled included. No run state, override, policy\noverride, budget or bead link carries over -- this is a fresh intake, not a\nclone of the row.",[627,986,988],{"className":629,"code":987,"language":631,"meta":632,"style":632},"{\"id\": \"...\", \"status\": \"paused\", \"duplicate_warning\": \"...\"}\n",[280,989,990],{"__ignoreMap":632},[636,991,992,995,997,1000,1002,1004,1006,1009,1011,1013,1015,1017,1019,1021,1023,1025,1027,1029,1031,1034,1036,1038,1040,1042,1044],{"class":638,"line":639},[636,993,994],{"class":642},"{",[636,996,655],{"class":642},[636,998,999],{"class":652},"id",[636,1001,655],{"class":642},[636,1003,658],{"class":642},[636,1005,674],{"class":642},[636,1007,1008],{"class":677},"...",[636,1010,655],{"class":642},[636,1012,683],{"class":642},[636,1014,674],{"class":642},[636,1016,347],{"class":652},[636,1018,655],{"class":642},[636,1020,658],{"class":642},[636,1022,674],{"class":642},[636,1024,491],{"class":677},[636,1026,655],{"class":642},[636,1028,683],{"class":642},[636,1030,674],{"class":642},[636,1032,1033],{"class":652},"duplicate_warning",[636,1035,655],{"class":642},[636,1037,658],{"class":642},[636,1039,674],{"class":642},[636,1041,1008],{"class":677},[636,1043,655],{"class":642},[636,1045,910],{"class":642},[276,1047,1048,1050,1051,1054,1055,1057],{},[280,1049,1033],{}," is present only when another open item looks like a\nduplicate, the same check ",[280,1052,1053],{},"POST \u002Fwork-items"," makes. A source whose stored\nattachment copy has gone missing answers ",[280,1056,620],{}," naming it, before anything is\nfiled.",[276,1059,1060,1063],{},[280,1061,1062],{},"POST \u002Fwork-items\u002Fbulk"," applies one action to several items at once:",[627,1065,1067],{"className":629,"code":1066,"language":631,"meta":632,"style":632},"{\"action\": \"pause\", \"ids\": [\"...\", \"...\"], \"reason\": \"...\"}\n",[280,1068,1069],{"__ignoreMap":632},[636,1070,1071,1073,1075,1078,1080,1082,1084,1087,1089,1091,1093,1096,1098,1100,1103,1105,1107,1109,1111,1113,1115,1117,1120,1122,1125,1127,1129,1131,1133,1135],{"class":638,"line":639},[636,1072,994],{"class":642},[636,1074,655],{"class":642},[636,1076,1077],{"class":652},"action",[636,1079,655],{"class":642},[636,1081,658],{"class":642},[636,1083,674],{"class":642},[636,1085,1086],{"class":677},"pause",[636,1088,655],{"class":642},[636,1090,683],{"class":642},[636,1092,674],{"class":642},[636,1094,1095],{"class":652},"ids",[636,1097,655],{"class":642},[636,1099,658],{"class":642},[636,1101,1102],{"class":642}," [",[636,1104,655],{"class":642},[636,1106,1008],{"class":677},[636,1108,655],{"class":642},[636,1110,683],{"class":642},[636,1112,674],{"class":642},[636,1114,1008],{"class":677},[636,1116,655],{"class":642},[636,1118,1119],{"class":642},"],",[636,1121,674],{"class":642},[636,1123,1124],{"class":652},"reason",[636,1126,655],{"class":642},[636,1128,658],{"class":642},[636,1130,674],{"class":642},[636,1132,1008],{"class":677},[636,1134,655],{"class":642},[636,1136,910],{"class":642},[276,1138,1139,547,1141,360,1143,360,1146,360,1149,1152,1153,1155,1156,1158,1159,1161,1162,348,1164,1166],{},[280,1140,1077],{},[280,1142,1086],{},[280,1144,1145],{},"cancel",[280,1147,1148],{},"archive",[280,1150,1151],{},"restore"," -- the same door\neach one's own single-item route already has, called once per id, each in its\nown write, in ",[280,1154,1095],{}," order. ",[280,1157,1124],{}," is required, and checked before anything\nis touched, when ",[280,1160,1077],{}," is ",[280,1163,1145],{},[280,1165,426],{}," otherwise); the other three\nignore it. The response is one result per id, in order:",[627,1168,1170],{"className":629,"code":1169,"language":631,"meta":632,"style":632},"{\"results\": [{\"id\": \"...\", \"ok\": true, \"status\": \"paused\"}, {\"id\": \"...\", \"ok\": false, \"error\": \"...\"}]}\n",[280,1171,1172],{"__ignoreMap":632},[636,1173,1174,1176,1178,1181,1183,1185,1188,1190,1192,1194,1196,1198,1200,1202,1204,1206,1208,1210,1212,1215,1217,1219,1221,1223,1225,1227,1229,1232,1234,1236,1238,1240,1242,1244,1246,1248,1250,1252,1254,1256,1258,1261,1263,1266,1268,1270,1272,1274,1276],{"class":638,"line":639},[636,1175,994],{"class":642},[636,1177,655],{"class":642},[636,1179,1180],{"class":652},"results",[636,1182,655],{"class":642},[636,1184,658],{"class":642},[636,1186,1187],{"class":642}," [{",[636,1189,655],{"class":642},[636,1191,999],{"class":666},[636,1193,655],{"class":642},[636,1195,658],{"class":642},[636,1197,674],{"class":642},[636,1199,1008],{"class":677},[636,1201,655],{"class":642},[636,1203,683],{"class":642},[636,1205,674],{"class":642},[636,1207,351],{"class":666},[636,1209,655],{"class":642},[636,1211,658],{"class":642},[636,1213,1214],{"class":642}," true,",[636,1216,674],{"class":642},[636,1218,347],{"class":666},[636,1220,655],{"class":642},[636,1222,658],{"class":642},[636,1224,674],{"class":642},[636,1226,491],{"class":677},[636,1228,655],{"class":642},[636,1230,1231],{"class":642},"},",[636,1233,661],{"class":642},[636,1235,655],{"class":642},[636,1237,999],{"class":666},[636,1239,655],{"class":642},[636,1241,658],{"class":642},[636,1243,674],{"class":642},[636,1245,1008],{"class":677},[636,1247,655],{"class":642},[636,1249,683],{"class":642},[636,1251,674],{"class":642},[636,1253,351],{"class":666},[636,1255,655],{"class":642},[636,1257,658],{"class":642},[636,1259,1260],{"class":642}," false,",[636,1262,674],{"class":642},[636,1264,1265],{"class":666},"error",[636,1267,655],{"class":642},[636,1269,658],{"class":642},[636,1271,674],{"class":642},[636,1273,1008],{"class":677},[636,1275,655],{"class":642},[636,1277,1278],{"class":642},"}]}\n",[276,1280,1281,1282,1285,1286,1289,1290,1292],{},"An id whose action raises (an item in the wrong status, say) becomes ",[280,1283,1284],{},"{id, ok: false, error}"," and the rest of the batch still runs; an id naming no work\nitem answers ",[280,1287,1288],{},"{id, ok: false, error: \"not found\"}",". ",[280,1291,347],{}," is the item's\nstored status after the action ran.",[289,1294,1296],{"id":1295},"mr-closed-externally","MR closed externally",[276,1298,1299,1300,1302,1303,1305,1306,1309,1310,420,1313,1316,1317,1320],{},"A poller checks every ",[280,1301,497],{},"\u002F",[280,1304,522],{}," item parked at a merge-request\nnode against the forge every ",[280,1307,1308],{},"policy.forge_poll_s"," seconds (default 300). When\nthe merge request was closed there without merging, it stops the item with\n",[280,1311,1312],{},"stop.kind: \"mr_closed\"",[280,1314,1315],{},"facts: {ref, url}"," (see ",[297,1318,1319],{"href":587},"Events →\nwork_item_needs_human",").",[276,1322,1323,1326,1327,1329,1330,1332,1333,1335,1336,427,1338,1341,1342,1345,1346,1348,1349,301],{},[280,1324,1325],{},"POST \u002Fwork-items\u002F{id}\u002Freopen-mr"," reopens that merge request on the forge and\nretries the stopped node, the same as ",[280,1328,959],{}," with no\n",[280,1331,966],{}," -- it answers ",[280,1334,620],{}," unless the item is actually stopped with\n",[280,1337,1312],{},[280,1339,1340],{},"502"," with the forge's own message when the\nforge call fails (the item stays stopped). Its response is ",[280,1343,1344],{},"\u002Fretry","'s own\nresponse shape. \"Open a new MR\" instead is ",[280,1347,1344],{}," with the MR node's path;\ncancelling the item instead is ",[280,1350,624],{},[289,1352,1354],{"id":1353},"daily-total-and-dry-run","Daily total and dry run",[276,1356,1357,1360,1361,658],{},[280,1358,1359],{},"GET \u002Fbudget\u002Ftoday"," answers the instance's spend since local midnight against\n",[280,1362,1363],{},"policy.budget.daily_usd",[627,1365,1367],{"className":629,"code":1366,"language":631,"meta":632,"style":632},"{\"spent_usd\": 3.4, \"cap_usd\": 20.0}\n",[280,1368,1369],{"__ignoreMap":632},[636,1370,1371,1373,1375,1377,1379,1381,1384,1386,1388,1390,1392,1394,1397],{"class":638,"line":639},[636,1372,994],{"class":642},[636,1374,655],{"class":642},[636,1376,886],{"class":652},[636,1378,655],{"class":642},[636,1380,658],{"class":642},[636,1382,1383],{"class":710}," 3.4",[636,1385,683],{"class":642},[636,1387,674],{"class":642},[636,1389,900],{"class":652},[636,1391,655],{"class":642},[636,1393,658],{"class":642},[636,1395,1396],{"class":710}," 20.0",[636,1398,910],{"class":642},[276,1400,1401,1161,1403,1405,1406,1408,1409,1411,1412,1415,1416,1419,1420,1423,1424,360,1426,562,1429,1431],{},[280,1402,900],{},[280,1404,518],{}," when ",[280,1407,1363],{}," is unset. ",[280,1410,449],{},"'s ",[280,1413,1414],{},"budget_cap"," gains the same two numbers under ",[280,1417,1418],{},"daily","\n(",[280,1421,1422],{},"{spent_usd, cap_usd}","); its three existing keys (",[280,1425,900],{},[280,1427,1428],{},"source",[280,1430,886],{},") are unchanged and stay the item's own, all-time spend.",[276,1433,1434,1437,1438,1440,1441,1444,1445,1448,1449,352,1451,1454],{},[280,1435,1436],{},"POST \u002Fwork-items?dry_run=1"," runs every check ",[280,1439,1053],{}," runs, up to\nand including validating ",[280,1442,1443],{},"node_overrides",", then answers ",[280,1446,1447],{},"200"," without filing\nanything -- no row, no bead, no attachment copy, no spawn. A body that would\nanswer ",[280,1450,426],{},[280,1452,1453],{},"503"," on an ordinary create answers the same on a dry run.",[627,1456,1458],{"className":629,"code":1457,"language":631,"meta":632,"style":632},"{\n  \"dry_run\": true,\n  \"nodes\": [...],\n  \"skipped\": [{\"node\": \"spec\", \"why\": \"covered_by\", \"kind\": \"spec\"}, {\"node\": \"...\", \"why\": \"skip\"}],\n  \"gates\": [\"spec_approval\", \"...\"],\n  \"caps\": {\n    \"budget_usd\": 5.0,\n    \"budget_source\": \"item\",\n    \"daily_usd\": 20.0,\n    \"nodes\": {\"implement\": {\"attempts\": 3, \"wall_clock_s\": 7200}}\n  }\n}\n",[280,1459,1460,1464,1478,1496,1597,1627,1641,1658,1679,1695,1749,1755],{"__ignoreMap":632},[636,1461,1462],{"class":638,"line":639},[636,1463,643],{"class":642},[636,1465,1466,1468,1471,1473,1475],{"class":638,"line":646},[636,1467,649],{"class":642},[636,1469,1470],{"class":652},"dry_run",[636,1472,655],{"class":642},[636,1474,658],{"class":642},[636,1476,1477],{"class":642}," true,\n",[636,1479,1480,1482,1485,1487,1489,1491,1493],{"class":638,"line":724},[636,1481,649],{"class":642},[636,1483,1484],{"class":652},"nodes",[636,1486,655],{"class":642},[636,1488,658],{"class":642},[636,1490,1102],{"class":642},[636,1492,1008],{"class":717},[636,1494,1495],{"class":642},"],\n",[636,1497,1498,1500,1503,1505,1507,1509,1511,1513,1515,1517,1519,1522,1524,1526,1528,1531,1533,1535,1537,1540,1542,1544,1546,1549,1551,1553,1555,1557,1559,1561,1563,1565,1567,1569,1571,1573,1575,1577,1579,1581,1583,1585,1587,1589,1592,1594],{"class":638,"line":802},[636,1499,649],{"class":642},[636,1501,1502],{"class":652},"skipped",[636,1504,655],{"class":642},[636,1506,658],{"class":642},[636,1508,1187],{"class":642},[636,1510,655],{"class":642},[636,1512,667],{"class":666},[636,1514,655],{"class":642},[636,1516,658],{"class":642},[636,1518,674],{"class":642},[636,1520,1521],{"class":677},"spec",[636,1523,655],{"class":642},[636,1525,683],{"class":642},[636,1527,674],{"class":642},[636,1529,1530],{"class":666},"why",[636,1532,655],{"class":642},[636,1534,658],{"class":642},[636,1536,674],{"class":642},[636,1538,1539],{"class":677},"covered_by",[636,1541,655],{"class":642},[636,1543,683],{"class":642},[636,1545,674],{"class":642},[636,1547,1548],{"class":666},"kind",[636,1550,655],{"class":642},[636,1552,658],{"class":642},[636,1554,674],{"class":642},[636,1556,1521],{"class":677},[636,1558,655],{"class":642},[636,1560,1231],{"class":642},[636,1562,661],{"class":642},[636,1564,655],{"class":642},[636,1566,667],{"class":666},[636,1568,655],{"class":642},[636,1570,658],{"class":642},[636,1572,674],{"class":642},[636,1574,1008],{"class":677},[636,1576,655],{"class":642},[636,1578,683],{"class":642},[636,1580,674],{"class":642},[636,1582,1530],{"class":666},[636,1584,655],{"class":642},[636,1586,658],{"class":642},[636,1588,674],{"class":642},[636,1590,1591],{"class":677},"skip",[636,1593,655],{"class":642},[636,1595,1596],{"class":642},"}],\n",[636,1598,1599,1601,1604,1606,1608,1610,1612,1615,1617,1619,1621,1623,1625],{"class":638,"line":870},[636,1600,649],{"class":642},[636,1602,1603],{"class":652},"gates",[636,1605,655],{"class":642},[636,1607,658],{"class":642},[636,1609,1102],{"class":642},[636,1611,655],{"class":642},[636,1613,1614],{"class":677},"spec_approval",[636,1616,655],{"class":642},[636,1618,683],{"class":642},[636,1620,674],{"class":642},[636,1622,1008],{"class":677},[636,1624,655],{"class":642},[636,1626,1495],{"class":642},[636,1628,1629,1631,1634,1636,1638],{"class":638,"line":913},[636,1630,649],{"class":642},[636,1632,1633],{"class":652},"caps",[636,1635,655],{"class":642},[636,1637,658],{"class":642},[636,1639,1640],{"class":642}," {\n",[636,1642,1644,1647,1650,1652,1654,1656],{"class":638,"line":1643},7,[636,1645,1646],{"class":642},"    \"",[636,1648,1649],{"class":666},"budget_usd",[636,1651,655],{"class":642},[636,1653,658],{"class":642},[636,1655,907],{"class":710},[636,1657,562],{"class":642},[636,1659,1661,1663,1666,1668,1670,1672,1675,1677],{"class":638,"line":1660},8,[636,1662,1646],{"class":642},[636,1664,1665],{"class":666},"budget_source",[636,1667,655],{"class":642},[636,1669,658],{"class":642},[636,1671,674],{"class":642},[636,1673,1674],{"class":677},"item",[636,1676,655],{"class":642},[636,1678,562],{"class":642},[636,1680,1682,1684,1687,1689,1691,1693],{"class":638,"line":1681},9,[636,1683,1646],{"class":642},[636,1685,1686],{"class":666},"daily_usd",[636,1688,655],{"class":642},[636,1690,658],{"class":642},[636,1692,1396],{"class":710},[636,1694,562],{"class":642},[636,1696,1698,1700,1702,1704,1706,1708,1710,1713,1715,1717,1719,1721,1725,1727,1729,1732,1734,1736,1739,1741,1743,1746],{"class":638,"line":1697},10,[636,1699,1646],{"class":642},[636,1701,1484],{"class":666},[636,1703,655],{"class":642},[636,1705,658],{"class":642},[636,1707,661],{"class":642},[636,1709,655],{"class":642},[636,1711,1712],{"class":710},"implement",[636,1714,655],{"class":642},[636,1716,658],{"class":642},[636,1718,661],{"class":642},[636,1720,655],{"class":642},[636,1722,1724],{"class":1723},"swJcz","attempts",[636,1726,655],{"class":642},[636,1728,658],{"class":642},[636,1730,1731],{"class":710}," 3",[636,1733,683],{"class":642},[636,1735,674],{"class":642},[636,1737,1738],{"class":1723},"wall_clock_s",[636,1740,655],{"class":642},[636,1742,658],{"class":642},[636,1744,1745],{"class":710}," 7200",[636,1747,1748],{"class":642},"}}\n",[636,1750,1752],{"class":638,"line":1751},11,[636,1753,1754],{"class":642},"  }\n",[636,1756,1758],{"class":638,"line":1757},12,[636,1759,910],{"class":642},[276,1761,1762,1764,1765,1768,1769,1771,1772,1775,1776,1778,1779,1781,1782,1784,1785,1302,1788,1790,1791,1794,1795,1797,1798,1801,1802,1805,1806,1302,1808,1810,1811,562,1814,1816],{},[280,1763,1484],{}," is the chain that would be filed, in ",[280,1766,1767],{},"chain_definition","'s own node\nshape. ",[280,1770,1502],{}," lists every node the attachments or ",[280,1773,1774],{},"skip_nodes"," dropped:\n",[280,1777,1539],{}," names the attachment kind that made it redundant, ",[280,1780,1591],{}," is an\noperator's own choice. ",[280,1783,1603],{}," is the ids of the gate nodes left in the chain.\n",[280,1786,1787],{},"caps.budget_usd",[280,1789,1665],{}," mirror the create route's own cap\nresolution (",[280,1792,1793],{},"\"item\""," for the body's own ",[280,1796,1649],{},", else ",[280,1799,1800],{},"\"policy\"",");\n",[280,1803,1804],{},"caps.nodes"," is each fix-loop node's ",[280,1807,1724],{},[280,1809,1738],{},", resolved the\nsame way the walk resolves them at run time -- the node's own ",[280,1812,1813],{},"policy",[280,1815,1443],{}," entry and any item-wide override each layered on in the same\norder, so a node's own override and an item-wide value each show where they\napply.",[289,1818,1820],{"id":1819},"events-paging-and-the-run-summary","Events paging and the run summary",[276,1822,1823,1826,1827,1419,1830,1833,1834,1837,1838,1841,1842,1845,1846,1848,1849,1289,1851,1853,1854,1856,1857,1859,1860,1862,1863,1316,1866,1320],{},[280,1824,1825],{},"GET \u002Fwork-items\u002F{id}\u002Fevents"," normally returns every event after ",[280,1828,1829],{},"after_seq",[280,1831,1832],{},"0"," by default). ",[280,1835,1836],{},"before_seq"," pages backward instead: it returns the last\n",[280,1839,1840],{},"limit"," events with ",[280,1843,1844],{},"seq \u003C before_seq",", oldest first, in the same row shape --\n100 when ",[280,1847,1836],{}," is given with no ",[280,1850,1840],{},[280,1852,1840],{}," alone bounds\n",[280,1855,1829],{},"'s own forward window to the first ",[280,1858,1840],{}," events after it (1-500;\noutside that range, or passing both cursors at once, answers ",[280,1861,426],{},"). Every\nevent row carries a ",[280,1864,1865],{},"node_id",[297,1867,240],{"href":241},[276,1869,1870,1872,1873,1876],{},[280,1871,449],{}," adds ",[280,1874,1875],{},"summary",", a run's progress at a glance:",[627,1878,1880],{"className":629,"code":1879,"language":631,"meta":632,"style":632},"{\"nodes_done\": 3, \"nodes_total\": 8, \"gates_passed\": 1, \"step\": {\"index\": 2, \"count\": 2} | null}\n",[280,1881,1882],{"__ignoreMap":632},[636,1883,1884,1886,1888,1891,1893,1895,1897,1899,1901,1904,1906,1908,1911,1913,1915,1918,1920,1922,1924,1926,1928,1931,1933,1935,1937,1939,1942,1944,1946,1949,1951,1953,1956,1958,1960,1962,1964,1966],{"class":638,"line":639},[636,1885,994],{"class":642},[636,1887,655],{"class":642},[636,1889,1890],{"class":652},"nodes_done",[636,1892,655],{"class":642},[636,1894,658],{"class":642},[636,1896,1731],{"class":710},[636,1898,683],{"class":642},[636,1900,674],{"class":642},[636,1902,1903],{"class":652},"nodes_total",[636,1905,655],{"class":642},[636,1907,658],{"class":642},[636,1909,1910],{"class":710}," 8",[636,1912,683],{"class":642},[636,1914,674],{"class":642},[636,1916,1917],{"class":652},"gates_passed",[636,1919,655],{"class":642},[636,1921,658],{"class":642},[636,1923,711],{"class":710},[636,1925,683],{"class":642},[636,1927,674],{"class":642},[636,1929,1930],{"class":652},"step",[636,1932,655],{"class":642},[636,1934,658],{"class":642},[636,1936,661],{"class":642},[636,1938,655],{"class":642},[636,1940,1941],{"class":666},"index",[636,1943,655],{"class":642},[636,1945,658],{"class":642},[636,1947,1948],{"class":710}," 2",[636,1950,683],{"class":642},[636,1952,674],{"class":642},[636,1954,1955],{"class":666},"count",[636,1957,655],{"class":642},[636,1959,658],{"class":642},[636,1961,1948],{"class":710},[636,1963,714],{"class":642},[636,1965,718],{"class":717},[636,1967,1968],{"class":642},"null}\n",[276,1970,1971,1302,1973,1975,1976,1978,1979,1981,1982,1984],{},[280,1972,1890],{},[280,1974,1903],{}," count against the frozen chain; ",[280,1977,1917],{}," is\nhow many of the completed nodes were gates. ",[280,1980,1930],{}," is the current node's step\n(1-based) out of its own steps, read from its latest non-escalation session's\ntask, when the node declares more than one -- ",[280,1983,518],{}," otherwise.",[276,1986,1987,420,1990,1993,1994,398,1997,2000,2001,2004,2005,2008,2009,420,2012,2015,2016,2019],{},[280,1988,1989],{},"GET \u002Fapi\u002Fwork-items\u002F{id}\u002Fdiff",[280,1991,1992],{},"GET \u002Fapi\u002Fwork-items\u002F{id}\u002Fcompare"," take an\noptional ",[280,1995,1996],{},"ignore_whitespace=true",[280,1998,1999],{},"git diff -w",". A file whose only change\nis whitespace then drops out of ",[280,2002,2003],{},"files",", the per-file counts and ",[280,2006,2007],{},"diff"," together,\nso the three never disagree; ",[280,2010,2011],{},"touched_by",[280,2013,2014],{},"untracked"," do not follow it. Both\nanswers carry ",[280,2017,2018],{},"ignore_whitespace",", the value they used.",[276,2021,2022,2025,2026,2029,2030,2032,2033,2036,2037,377,2039,348,2042,2045,2046,2049,2050,2052,2053,2056,2057,2060,2061,2063,2064,2067,2068,360,2071,2074,2075,2077,2078,2081,2082,2084],{},[280,2023,2024],{},"GET \u002Fapi\u002Fwork-items\u002F{id}"," carries ",[280,2027,2028],{},"fix_target"," while a gate is pending: the\n",[280,2031,667],{}," a request-changes review restarts at, the nodes ",[280,2034,2035],{},"then"," that run before it\nreturns to the ",[280,2038,550],{},[280,2040,2041],{},"round",[280,2043,2044],{},"n"," of ",[280,2047,2048],{},"max",") a rejection now would start,\ncounted against the cap the gate's reject loop already snapshotted. It is ",[280,2051,518],{},"\nwith no gate pending. ",[280,2054,2055],{},"GET \u002Fapi\u002Fwork-items\u002F{id}\u002Ffix-target?node=&gate="," answers\nfor a target the reviewer picked; with no gate pending it gives what a gateless\n",[280,2058,2059],{},"request_changes"," would target, with ",[280,2062,1124],{}," one of ",[280,2065,2066],{},"requested"," (you named the\nnode), ",[280,2069,2070],{},"threads on \u003Cpath or node>",[280,2072,2073],{},"current node",", or ",[280,2076,550],{},". It answers ",[280,2079,2080],{},"400","\nfor a node that is not before the gate, ",[280,2083,620],{}," for a gate that is not pending or an\nended item, and does git work per thread, so call it on demand.",[276,2086,2087,2089,2090,1289,2093,599,2096,2099,2100,2103,2104,2107,2108,2111,2112,2115,2116,2118,2119,2122,2123,2126,2127,2129,2130,2132],{},[280,2088,1992],{}," marks each file ",[280,2091,2092],{},"viewed",[280,2094,2095],{},"PUT",[280,2097,2098],{},"DELETE \u002Fapi\u002Fwork-items\u002F{id}\u002Fviewed?file=\u003Cpath>&to=\u003Ctarget>"," set and clear the\nmark and answer ",[280,2101,2102],{},"{file, to, viewed}","; ",[280,2105,2106],{},"to"," is a compare target (default ",[280,2109,2110],{},"latest",")\nand ",[280,2113,2114],{},"file"," a repository-relative path. A mark belongs to the file's content at\n",[280,2117,2106],{},", not to the ",[280,2120,2121],{},"from"," side, so a file that has not changed since you ticked it\nstays ticked in any other comparison and a new attempt that edits it clears the\ntick. ",[280,2124,2125],{},"DELETE"," clears the mark on that content wherever it was made. The routes\nanswer ",[280,2128,437],{}," for a target the item does not have and ",[280,2131,2080],{}," for a path outside the\nrepository.",[289,2134,2136],{"id":2135},"the-schema","The schema",[276,2138,2139],{},"FastAPI generates a schema of every route:",[303,2141,2142,2152],{},[306,2143,2144],{},[309,2145,2146,2149],{},[312,2147,2148],{},"Path",[312,2150,2151],{},"What it serves",[319,2153,2154,2164,2174],{},[309,2155,2156,2161],{},[324,2157,2158],{},[280,2159,2160],{},"\u002Fopenapi.json",[324,2162,2163],{},"The OpenAPI schema, as JSON.",[309,2165,2166,2171],{},[324,2167,2168],{},[280,2169,2170],{},"\u002Fdocs",[324,2172,2173],{},"Swagger UI for that schema.",[309,2175,2176,2181],{},[324,2177,2178],{},[280,2179,2180],{},"\u002Fredoc",[324,2182,2183],{},"ReDoc for that schema.",[627,2185,2189],{"className":2186,"code":2187,"language":2188,"meta":632,"style":632},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","curl -s http:\u002F\u002F127.0.0.1:8765\u002Fopenapi.json | jq '.paths | keys'\n","bash",[280,2190,2191],{"__ignoreMap":632},[636,2192,2193,2196,2199,2202,2205,2208,2211,2214],{"class":638,"line":639},[636,2194,2195],{"class":666},"curl",[636,2197,2198],{"class":677}," -s",[636,2200,2201],{"class":677}," http:\u002F\u002F127.0.0.1:8765\u002Fopenapi.json",[636,2203,2204],{"class":642}," |",[636,2206,2207],{"class":666}," jq",[636,2209,2210],{"class":642}," '",[636,2212,2213],{"class":677},".paths | keys",[636,2215,2216],{"class":642},"'\n",[276,2218,2219,2220,352,2222,2224,2225,2227],{},"These three paths need no login. Open ",[280,2221,2170],{},[280,2223,2180],{}," in a browser to read\nthe API there. Both pages load their scripts from a public CDN, so on a machine\nwithout internet access, load ",[280,2226,2160],{}," into your own OpenAPI viewer.",[289,2229,2231],{"id":2230},"who-may-call","Who may call",[303,2233,2234,2244],{},[306,2235,2236],{},[309,2237,2238,2241],{},[312,2239,2240],{},"Caller",[312,2242,2243],{},"What it needs",[319,2245,2246,2254,2269,2284],{},[309,2247,2248,2251],{},[324,2249,2250],{},"A process on the same machine, while Kraft is bound to loopback",[324,2252,2253],{},"Nothing.",[309,2255,2256,2259],{},[324,2257,2258],{},"Anyone, once Kraft is bound off loopback",[324,2260,2261,2262,2265,2266,301],{},"A browser session from the login page, or the MCP bearer token in ",[280,2263,2264],{},"$KRAFT_HOME\u002Frun\u002Fmcp-token",", sent as ",[280,2267,2268],{},"Authorization: Bearer \u003Ctoken>",[309,2270,2271,2274],{},[324,2272,2273],{},"A trigger sender, once Kraft is bound off loopback",[324,2275,2276,2277,2279,2280,2283],{},"For ",[280,2278,328],{}," only, the trigger token in ",[280,2281,2282],{},"$KRAFT_HOME\u002Frun\u002Ftrigger-token",", sent the same way.",[309,2285,2286,2289],{},[324,2287,2288],{},"A remote caller while no password is set",[324,2290,2291,2292,301],{},"Nothing works. Kraft answers ",[280,2293,2294],{},"403",[276,2296,2297,2298,2301,2302,2305,2306,2308,2309,2311,2312,2314],{},"A request without valid credentials gets ",[280,2299,2300],{},"401",". A browser request whose ",[280,2303,2304],{},"Host","\nis not an allowed name, or a cross-site write, gets ",[280,2307,2294],{},". The MCP bearer token is\na full-access credential. See ",[297,2310,259],{"href":260}," for the whole\nmodel, and ",[297,2313,67],{"href":68}," to set a password.",[2316,2317,2318],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":632,"searchDepth":646,"depth":646,"links":2320},[2321,2322,2323,2324,2325,2326,2327,2328,2329],{"id":291,"depth":646,"text":292},{"id":440,"depth":646,"text":441},{"id":606,"depth":646,"text":607},{"id":953,"depth":646,"text":954},{"id":1295,"depth":646,"text":1296},{"id":1353,"depth":646,"text":1354},{"id":1819,"depth":646,"text":1820},{"id":2135,"depth":646,"text":2136},{"id":2230,"depth":646,"text":2231},"Which of Kraft's HTTP routes are stable, where the full schema is, and who may call them.","md",null,{},true,{"title":232,"description":2330},"Ut4KoWZu9dgBk2Y7Uu0OiTO_ouS4U__Oo-kUXqyWJts",[2338,2340],{"title":228,"path":229,"stem":230,"description":2339,"children":-1},"The trigger fields in policy.yaml and the POST \u002Fapi\u002Ftriggers contract for starting a chain from a schedule or a webhook.",{"title":236,"path":237,"stem":238,"description":2341,"children":-1},"Every tool the kraft MCP server serves, with its parameters and the kraft command that does the same.",1790824507790]