[{"data":1,"prerenderedAt":831},["ShallowReactive",2],{"navigation_docs":3,"-guides-adding-a-harness":270,"-guides-adding-a-harness-surround":826},[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":71,"body":272,"description":819,"extension":820,"links":821,"meta":822,"navigation":823,"path":72,"seo":824,"stem":73,"__hash__":825},"docs\u002F3.guides\u002F04.adding-a-harness.md",{"type":273,"value":274,"toc":808},"minimark",[275,283,288,591,596,599,613,623,627,667,674,678,681,687,691,773,777,798,801,804],[276,277,278,279,282],"p",{},"Add a new agent CLI to Kraft, or change how a shipped one is launched, by\ndropping a YAML file into a directory. No Python change and no Kraft release\nare involved. For what each field means, see\n",[280,281,206],"a",{"href":207},".",[284,285,287],"h2",{"id":286},"add-a-harness","Add a harness",[289,290,291,307,472,491,569],"ol",{},[292,293,294,295,299,300,303,304,282],"li",{},"Create ",[296,297,298],"code",{},"$KRAFT_HOME\u002Ftemplates\u002Fharnesses\u002Fmytool.yaml"," (",[296,301,302],{},"~\u002F.kraft\u002Ftemplates\u002Fharnesses\u002F","\nby default). Make the directory if it doesn't exist. The file name's stem\nmust equal the ",[296,305,306],{},"id",[292,308,309,310],{},"Start with the three required capabilities:",[311,312,317],"pre",{"className":313,"code":314,"language":315,"meta":316,"style":316},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","id: mytool          # must match the file name's stem\nkind: cli           # the only kind implemented\ncommand: [mytool]   # argv prefix\ncapabilities:\n  prompt:  { cli: [\"-p\", \"{value}\"] }\n  context: { channel: prompt }       # or: { channel: system_prompt, cli: [...] }\n  usage:   { source: result_file }   # or: { source: envelope, reader: \u003Cparser name> }\n","yaml","",[296,318,319,339,353,373,382,423,448],{"__ignoreMap":316},[320,321,324,327,331,335],"span",{"class":322,"line":323},"line",1,[320,325,306],{"class":326},"swJcz",[320,328,330],{"class":329},"sMK4o",":",[320,332,334],{"class":333},"sfazB"," mytool",[320,336,338],{"class":337},"sHwdD","          # must match the file name's stem\n",[320,340,342,345,347,350],{"class":322,"line":341},2,[320,343,344],{"class":326},"kind",[320,346,330],{"class":329},[320,348,349],{"class":333}," cli",[320,351,352],{"class":337},"           # the only kind implemented\n",[320,354,356,359,361,364,367,370],{"class":322,"line":355},3,[320,357,358],{"class":326},"command",[320,360,330],{"class":329},[320,362,363],{"class":329}," [",[320,365,366],{"class":333},"mytool",[320,368,369],{"class":329},"]",[320,371,372],{"class":337},"   # argv prefix\n",[320,374,376,379],{"class":322,"line":375},4,[320,377,378],{"class":326},"capabilities",[320,380,381],{"class":329},":\n",[320,383,385,388,390,393,395,397,399,402,405,407,410,413,416,418,420],{"class":322,"line":384},5,[320,386,387],{"class":326},"  prompt",[320,389,330],{"class":329},[320,391,392],{"class":329},"  {",[320,394,349],{"class":326},[320,396,330],{"class":329},[320,398,363],{"class":329},[320,400,401],{"class":329},"\"",[320,403,404],{"class":333},"-p",[320,406,401],{"class":329},[320,408,409],{"class":329},",",[320,411,412],{"class":329}," \"",[320,414,415],{"class":333},"{value}",[320,417,401],{"class":329},[320,419,369],{"class":329},[320,421,422],{"class":329}," }\n",[320,424,426,429,431,434,437,439,442,445],{"class":322,"line":425},6,[320,427,428],{"class":326},"  context",[320,430,330],{"class":329},[320,432,433],{"class":329}," {",[320,435,436],{"class":326}," channel",[320,438,330],{"class":329},[320,440,441],{"class":333}," prompt",[320,443,444],{"class":329}," }",[320,446,447],{"class":337},"       # or: { channel: system_prompt, cli: [...] }\n",[320,449,451,454,456,459,462,464,467,469],{"class":322,"line":450},7,[320,452,453],{"class":326},"  usage",[320,455,330],{"class":329},[320,457,458],{"class":329},"   {",[320,460,461],{"class":326}," source",[320,463,330],{"class":329},[320,465,466],{"class":333}," result_file",[320,468,444],{"class":329},[320,470,471],{"class":337},"   # or: { source: envelope, reader: \u003Cparser name> }\n",[292,473,474,475,478,479,482,483,486,487,490],{},"Add each optional capability the CLI supports (",[296,476,477],{},"model",", ",[296,480,481],{},"effort",",\n",[296,484,485],{},"permission_mode",", and so on) with the ",[296,488,489],{},"cli:"," fragment that sets it. Leave\nout what the CLI can't do. A task that asks for a capability you left out is\nrejected at load, pointing at this file.",[292,492,493,494,497,498,501,502,330,504,553,556,557,560,561,564,565,568],{},"Add a profile for the harness in ",[296,495,496],{},"~\u002F.kraft\u002Ftemplates\u002Fharnesses.yaml",",\nthen select it from a task. The profile's ",[296,499,500],{},"provider"," is your harness ",[296,503,306],{},[311,505,507],{"className":313,"code":506,"language":315,"meta":316,"style":316},"harnesses:\n  mytool:\n    provider: mytool\n    enabled: true\n    executable: mytool\n",[296,508,509,516,523,533,544],{"__ignoreMap":316},[320,510,511,514],{"class":322,"line":323},[320,512,513],{"class":326},"harnesses",[320,515,381],{"class":329},[320,517,518,521],{"class":322,"line":341},[320,519,520],{"class":326},"  mytool",[320,522,381],{"class":329},[320,524,525,528,530],{"class":322,"line":355},[320,526,527],{"class":326},"    provider",[320,529,330],{"class":329},[320,531,532],{"class":333}," mytool\n",[320,534,535,538,540],{"class":322,"line":375},[320,536,537],{"class":326},"    enabled",[320,539,330],{"class":329},[320,541,543],{"class":542},"sfNiH"," true\n",[320,545,546,549,551],{"class":322,"line":384},[320,547,548],{"class":326},"    executable",[320,550,330],{"class":329},[320,552,532],{"class":333},[554,555],"br",{},"In ",[296,558,559],{},"library.yaml",", a task that should run on it sets ",[296,562,563],{},"harness: mytool",".\nSee ",[280,566,567],{"href":165},"the harnesses file"," for every\nprofile field.",[292,570,571,572],{},"Reload the templates so a running server rereads them:",[311,573,577],{"className":574,"code":575,"language":576,"meta":316,"style":316},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","kraft admin reload\n","bash",[296,578,579],{"__ignoreMap":316},[320,580,581,585,588],{"class":322,"line":323},[320,582,584],{"class":583},"sBMFI","kraft",[320,586,587],{"class":333}," admin",[320,589,590],{"class":333}," reload\n",[592,593,595],"h3",{"id":594},"verify","Verify",[276,597,598],{},"Run the install check:",[311,600,602],{"className":574,"code":601,"language":576,"meta":316,"style":316},"kraft admin doctor\n",[296,603,604],{"__ignoreMap":316},[320,605,606,608,610],{"class":322,"line":323},[320,607,584],{"class":583},[320,609,587],{"class":333},[320,611,612],{"class":333}," doctor\n",[276,614,615,616,619,620,282],{},"Expect a ",[296,617,618],{},"PATH"," row for your harness once a chain selects it, and no load\nerror for your file. A load error names the file and the field to fix. To see\nwhich library tasks select each harness profile, run\n",[296,621,622],{},"kraft admin harnesses",[284,624,626],{"id":625},"override-a-shipped-harness","Override a shipped harness",[276,628,629,630,482,633,478,636,478,639,478,642,645,646,649,650,658,659,662,663,666],{},"Use the same steps, with a file named after a shipped harness: ",[296,631,632],{},"claude.yaml",[296,634,635],{},"codex.yaml",[296,637,638],{},"cursor.yaml",[296,640,641],{},"opencode.yaml",[296,643,644],{},"gemini.yaml",", or ",[296,647,648],{},"amp.yaml",".\nYour file replaces the shipped one whole, so start from the shipped definition,\n",[280,651,655],{"href":652,"rel":653},"https:\u002F\u002Fgithub.com\u002FitsOmidKarami\u002Fkraft\u002Ftree\u002Fmain\u002Fsrc\u002Fkraft\u002Fharnesses",[654],"nofollow",[296,656,657],{},"src\u002Fkraft\u002Fharnesses\u002Fclaude.yaml","\n(one file per harness), and change only what you need, such as ",[296,660,661],{},"claude","'s\n",[296,664,665],{},"--model"," allowlist.",[276,668,669,670,673],{},"Verify with ",[296,671,672],{},"kraft admin doctor",", as above.",[284,675,677],{"id":676},"set-up-amp-or-cursor-credentials","Set up Amp or Cursor credentials",[276,679,680],{},"A worker has no one to answer a login prompt, so give each CLI credentials it\ncan use without one.",[276,682,683,684,686],{},"Both CLIs are covered in more detail in\n",[280,685,206],{"href":207},". The steps here are the short path.",[592,688,690],{"id":689},"amp","Amp",[289,692,693,705,712,767],{},[292,694,695,696,699,700,704],{},"On a machine where you ran ",[296,697,698],{},"amp login",", do nothing more. The login lives\nunder your home directory, which a worker keeps. A\n",[280,701,703],{"href":702},"\u002Freference\u002Fconfiguration\u002Frepos#sandboxed-workers","sandboxed"," repository\nnever sees it: its workers get a home of their own, so use steps 2-4.",[292,706,707,708,711],{},"Elsewhere, create an access token (",[296,709,710],{},"sgamp_...",") at ampcode.com\u002Fsettings.",[292,713,714,715,718,719,722,723],{},"Name ",[296,716,717],{},"AMP_API_KEY"," in the repo's ",[296,720,721],{},"env_passthrough",", because a worker's\nenvironment is an allowlist:",[311,724,726],{"className":313,"code":725,"language":315,"meta":316,"style":316},"# repos.yaml\nrepos:\n  - path: \u002Fpath\u002Fto\u002Frepo\n    env_passthrough: [AMP_API_KEY]\n",[296,727,728,733,740,753],{"__ignoreMap":316},[320,729,730],{"class":322,"line":323},[320,731,732],{"class":337},"# repos.yaml\n",[320,734,735,738],{"class":322,"line":341},[320,736,737],{"class":326},"repos",[320,739,381],{"class":329},[320,741,742,745,748,750],{"class":322,"line":355},[320,743,744],{"class":329},"  -",[320,746,747],{"class":326}," path",[320,749,330],{"class":329},[320,751,752],{"class":333}," \u002Fpath\u002Fto\u002Frepo\n",[320,754,755,758,760,762,764],{"class":322,"line":375},[320,756,757],{"class":326},"    env_passthrough",[320,759,330],{"class":329},[320,761,363],{"class":329},[320,763,717],{"class":333},[320,765,766],{"class":329},"]\n",[292,768,769,770,772],{},"Export ",[296,771,717],{}," in the shell that starts the Kraft server, then\nrestart the server.",[592,774,776],{"id":775},"cursor","Cursor",[289,778,779,788],{},[292,780,695,781,784,785,787],{},[296,782,783],{},"agent login",", do nothing more. The login lives\nin the OS keychain, which a\n",[280,786,703],{"href":702}," worker\ncannot reach.",[292,789,790,791,794,795,797],{},"With an API key instead (the only way under a sandbox), name ",[296,792,793],{},"CURSOR_API_KEY"," in the repo's\n",[296,796,721],{},", export it in the shell that starts the server, and\nrestart the server.",[592,799,595],{"id":800},"verify-1",[276,802,803],{},"File a small work item with a task on the harness, or run the CLI's own\nheadless command by hand as the same user. Without credentials, Amp prints a\ndevice-login prompt and waits about five minutes for a browser before it exits\n1, so a hang on that prompt means the credentials didn't reach the worker.",[805,806,807],"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 .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}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":316,"searchDepth":341,"depth":341,"links":809},[810,813,814],{"id":286,"depth":341,"text":287,"children":811},[812],{"id":594,"depth":355,"text":595},{"id":625,"depth":341,"text":626},{"id":676,"depth":341,"text":677,"children":815},[816,817,818],{"id":689,"depth":355,"text":690},{"id":775,"depth":355,"text":776},{"id":800,"depth":355,"text":595},"Add an agent CLI to Kraft with a YAML file, override a shipped harness, and set up Amp or Cursor credentials.","md",null,{},true,{"title":71,"description":819},"zt8JuG7CS7WPTVXmFoIqcxZXDJD664PLkvaqhciAFfc",[827,829],{"title":67,"path":68,"stem":69,"description":828,"children":-1},"Approve or reject a gate from a phone, over Tailscale or a tunnel, using the same password auth as the local board.",{"title":75,"path":76,"stem":77,"description":830,"children":-1},"File a paused work item on a cron schedule or from a webhook, then check that it arrived.",1790824540974]