[{"data":1,"prerenderedAt":668},["ShallowReactive",2],{"navigation_docs":3,"-guides-review-a-change":270,"-guides-review-a-change-surround":663},[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":87,"body":272,"description":656,"extension":657,"links":658,"meta":659,"navigation":660,"path":88,"seo":661,"stem":89,"__hash__":662},"docs\u002F3.guides\u002F08.review-a-change.md",{"type":273,"value":274,"toc":647},"minimark",[275,284,289,379,393,418,422,437,441,448,451,501,512,515,543,549,553,559,563,610,632,636,643],[276,277,278,279,283],"p",{},"You can review a Kraft work item whenever you like — while it is running, while\nit is stopped for a human, or at a pending gate. Comments never interrupt an\nagent by themselves; only ",[280,281,282],"code",{},"request-changes"," does, and only the node it targets.",[285,286,288],"h2",{"id":287},"drafts-and-sending","Drafts and sending",[290,291,296],"pre",{"className":292,"code":293,"language":294,"meta":295,"style":295},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","kraft item comment --body \"this leaks the connection\" --file src\u002Fdb.py --lines 40-46 --label must-fix\nkraft view threads\nkraft item review comment --summary \"a few notes, nothing blocking\"\n","bash","",[280,297,298,345,356],{"__ignoreMap":295},[299,300,303,307,311,314,317,321,324,327,330,333,336,339,342],"span",{"class":301,"line":302},"line",1,[299,304,306],{"class":305},"sBMFI","kraft",[299,308,310],{"class":309},"sfazB"," item",[299,312,313],{"class":309}," comment",[299,315,316],{"class":309}," --body",[299,318,320],{"class":319},"sMK4o"," \"",[299,322,323],{"class":309},"this leaks the connection",[299,325,326],{"class":319},"\"",[299,328,329],{"class":309}," --file",[299,331,332],{"class":309}," src\u002Fdb.py",[299,334,335],{"class":309}," --lines",[299,337,338],{"class":309}," 40-46",[299,340,341],{"class":309}," --label",[299,343,344],{"class":309}," must-fix\n",[299,346,348,350,353],{"class":301,"line":347},2,[299,349,306],{"class":305},[299,351,352],{"class":309}," view",[299,354,355],{"class":309}," threads\n",[299,357,359,361,363,366,368,371,373,376],{"class":301,"line":358},3,[299,360,306],{"class":305},[299,362,310],{"class":309},[299,364,365],{"class":309}," review",[299,367,313],{"class":309},[299,369,370],{"class":309}," --summary",[299,372,320],{"class":319},[299,374,375],{"class":309},"a few notes, nothing blocking",[299,377,378],{"class":319},"\"\n",[276,380,381,384,385,388,389,392],{},[280,382,383],{},"kraft item comment"," files a draft. Drafts are invisible to every agent — and\nto ",[280,386,387],{},"kraft view threads"," output as anything but a draft — until you send them\nwith ",[280,390,391],{},"kraft item review",". That one command is one of three outcomes:",[394,395,396,403,413],"ul",{},[397,398,399,402],"li",{},[280,400,401],{},"comment"," queues your drafts for the next agent that runs. It never stops\nanything, and it works whether or not a gate is pending.",[397,404,405,408,409,412],{},[280,406,407],{},"approve"," needs a pending gate: it clears it, the same as ",[280,410,411],{},"kraft item approve",".",[397,414,415,417],{},[280,416,282],{}," redoes work now — see below.",[285,419,421],{"id":420},"must-fix","Must-fix",[276,423,424,425,428,429,432,433,436],{},"A comment labeled ",[280,426,427],{},"--label must-fix"," blocks every gate approval on the item\nuntil it is resolved, no matter which gate it was filed at or whether one was\npending at all. ",[280,430,431],{},"kraft item resolve \u003Cthread-id>"," clears it; ",[280,434,435],{},"kraft item reopen"," puts it back if the fix did not hold up.",[285,438,440],{"id":439},"commenting-while-it-runs","Commenting while it runs",[276,442,443,444,447],{},"Every agent dispatch — the next implementation run, every verify reviewer,\nevery fix-loop round — carries the item's unanswered threads. A working agent\n(no review skill) is told to address each one and reply with ",[280,445,446],{},"kraft item reply","; a reviewer agent is told to judge the change against them, and reports\nan unaddressed must-fix as a finding. A thread drops off the list the moment\nan agent replies or you resolve it.",[285,449,450],{"id":282},"Request changes",[290,452,454],{"className":292,"code":453,"language":294,"meta":295,"style":295},"kraft item review request-changes --summary \"please address the must-fix\"\nkraft item review request-changes --node implementation --summary \"redo this part\"\n",[280,455,456,476],{"__ignoreMap":295},[299,457,458,460,462,464,467,469,471,474],{"class":301,"line":302},[299,459,306],{"class":305},[299,461,310],{"class":309},[299,463,365],{"class":309},[299,465,466],{"class":309}," request-changes",[299,468,370],{"class":309},[299,470,320],{"class":319},[299,472,473],{"class":309},"please address the must-fix",[299,475,378],{"class":319},[299,477,478,480,482,484,486,489,492,494,496,499],{"class":301,"line":347},[299,479,306],{"class":305},[299,481,310],{"class":309},[299,483,365],{"class":309},[299,485,466],{"class":309},[299,487,488],{"class":309}," --node",[299,490,491],{"class":309}," implementation",[299,493,370],{"class":309},[299,495,320],{"class":319},[299,497,498],{"class":309},"redo this part",[299,500,378],{"class":319},[276,502,503,504,507,508,511],{},"With no ",[280,505,506],{},"--node",", the target is derived from your threads: the earliest node,\nat or before the one now running, that wrote what a thread is about (a\nthread's own ",[280,509,510],{},"file_path",", or the node it names). A whole-change comment falls\nback to the current working node.",[276,513,514],{},"The review page shows where the work will restart, the nodes that run after it,\nand which rejection round this would be, before you submit. It reads the same\ntarget the submit acts on, so the two cannot differ.",[394,516,517,520,530,537],{},[397,518,519],{},"If the target is the node that is running, it stops and re-runs now, with\nyour review as its note.",[397,521,522,523,526,527,412],{},"If the target is an earlier node, nothing running is touched. The rewind is\nqueued and takes effect the moment the running node finishes, or on your\nnext ",[280,524,525],{},"kraft item resume"," or ",[280,528,529],{},"kraft item retry",[397,531,532,533,536],{},"On a ",[280,534,535],{},"needs_human"," item with nothing else running, it retries at the target\nimmediately.",[397,538,539,540,542],{},"On a paused item, only the rewind is queued — resuming a paused item is your\ncall, so ",[280,541,282],{}," does not do it for you.",[276,544,545,546,412],{},"The response says which of these happened, and the CLI prints it:\n",[280,547,548],{},"request-changes -> implementation (threads on src\u002Fdb.py), rerun",[285,550,552],{"id":551},"gates-dont-ask-twice","Gates don't ask twice",[276,554,555,556,558],{},"Reaching a gate with an unanswered ",[280,557,420],{}," bounces it back to the reject\ntarget instead of opening — the same as if you had rejected it yourself,\ncapped by the gate's own reject-loop limit so an agent that never answers\ncannot loop forever. A gate with only unanswered questions or nits opens as\nusual, with the reply agent already launched to answer them.",[285,560,562],{"id":561},"comparing-attempts","Comparing attempts",[290,564,566],{"className":292,"code":565,"language":294,"meta":295,"style":295},"kraft view compare --from base --to latest\nkraft view compare --from attempt:1 --to attempt:2 --stat\n",[280,567,568,589],{"__ignoreMap":295},[299,569,570,572,574,577,580,583,586],{"class":301,"line":302},[299,571,306],{"class":305},[299,573,352],{"class":309},[299,575,576],{"class":309}," compare",[299,578,579],{"class":309}," --from",[299,581,582],{"class":309}," base",[299,584,585],{"class":309}," --to",[299,587,588],{"class":309}," latest\n",[299,590,591,593,595,597,599,602,604,607],{"class":301,"line":347},[299,592,306],{"class":305},[299,594,352],{"class":309},[299,596,576],{"class":309},[299,598,579],{"class":309},[299,600,601],{"class":309}," attempt:1",[299,603,585],{"class":309},[299,605,606],{"class":309}," attempt:2",[299,608,609],{"class":309}," --stat\n",[276,611,612,615,616,619,620,623,624,627,628,631],{},[280,613,614],{},"base",", ",[280,617,618],{},"last_review"," and ",[280,621,622],{},"latest"," (the working tree) resolve at any time.\n",[280,625,626],{},"attempt:N"," needs a pending gate. ",[280,629,630],{},"--nodes a,b"," limits the diff to files those\nnodes touched.",[285,633,635],{"id":634},"for-agents","For agents",[276,637,638,639,642],{},"A worker replies to a thread it was handed with ",[280,640,641],{},"kraft item reply \u003Cthread-id> --body \"...\" --claim fixed|answered|should_fix",". Every other review verb\nabove is refused from inside a worker's own worktree — reviewing is a human's\njob, or an assistant acting on a human's behalf from outside the item.",[644,645,646],"style",{},"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":295,"searchDepth":347,"depth":347,"links":648},[649,650,651,652,653,654,655],{"id":287,"depth":347,"text":288},{"id":420,"depth":347,"text":421},{"id":439,"depth":347,"text":440},{"id":282,"depth":347,"text":450},{"id":551,"depth":347,"text":552},{"id":561,"depth":347,"text":562},{"id":634,"depth":347,"text":635},"Comment on a Kraft work item at any point in its life, not only at a gate, and see your feedback reach the next agent that touches the code.","md",null,{},true,{"title":87,"description":656},"NYDtZPEODLw_SKarvgSVmsHRuqmDdAKr2ZMsbGy8-4c",[664,666],{"title":83,"path":84,"stem":85,"description":665,"children":-1},"Install the Kraft extension to clear gates, review a branch's diff, and edit Kraft config files without leaving VS Code.",{"title":91,"path":92,"stem":93,"description":667,"children":-1},"Add a lint node to a copy of the default chain, with an agent that fixes what lint reports, a time cap, and no way to skip it.",1790824507255]