[{"data":1,"prerenderedAt":1087},["ShallowReactive",2],{"navigation_docs":3,"-guides-harnesses-adding-a-harness":504,"-guides-harnesses-adding-a-harness-surround":1082},[4,28,51,187,214,469],{"title":5,"path":6,"stem":7,"children":8},"Get started","\u002Fget-started","1.get-started",[9,12,16,20,24],{"title":10,"path":6,"stem":11},"Overview","1.get-started\u002Findex",{"title":13,"path":14,"stem":15},"Why Kraft","\u002Fget-started\u002Fwhy-kraft","1.get-started\u002F0.why-kraft",{"title":17,"path":18,"stem":19},"Install","\u002Fget-started\u002Finstall","1.get-started\u002F1.install",{"title":21,"path":22,"stem":23},"Your first work item","\u002Fget-started\u002Ffirst-work-item","1.get-started\u002F2.first-work-item",{"title":25,"path":26,"stem":27},"FAQ","\u002Fget-started\u002Ffaq","1.get-started\u002F3.faq",{"title":29,"path":30,"stem":31,"children":32},"Concepts","\u002Fconcepts","2.concepts",[33,35,39,43,47],{"title":10,"path":30,"stem":34},"2.concepts\u002Findex",{"title":36,"path":37,"stem":38},"How a work item runs","\u002Fconcepts\u002Fhow-a-work-item-runs","2.concepts\u002F1.how-a-work-item-runs",{"title":40,"path":41,"stem":42},"Caps and budgets","\u002Fconcepts\u002Fcaps-and-budgets","2.concepts\u002F2.caps-and-budgets",{"title":44,"path":45,"stem":46},"Why a permission gate","\u002Fconcepts\u002Fpermission-gate","2.concepts\u002F3.permission-gate",{"title":48,"path":49,"stem":50},"Vocabulary","\u002Fconcepts\u002Fvocabulary","2.concepts\u002F4.vocabulary",{"title":52,"path":53,"stem":54,"children":55},"Guides","\u002Fguides","3.guides",[56,58,96,113,134,183],{"title":10,"path":53,"stem":57},"3.guides\u002Findex",{"title":59,"path":60,"stem":61,"children":62,"page":95},"Day to day","\u002Fguides\u002Fday-to-day","3.guides\u002F1.day-to-day",[63,67,71,75,79,83,87,91],{"title":64,"path":65,"stem":66},"The setup wizard on first start","\u002Fguides\u002Fday-to-day\u002Ffirst-run","3.guides\u002F1.day-to-day\u002F2.first-run",{"title":68,"path":69,"stem":70},"File a work item","\u002Fguides\u002Fday-to-day\u002Ffile-a-work-item","3.guides\u002F1.day-to-day\u002F3.file-a-work-item",{"title":72,"path":73,"stem":74},"Use Kraft from your agent","\u002Fguides\u002Fday-to-day\u002Fagent-integration","3.guides\u002F1.day-to-day\u002F4.agent-integration",{"title":76,"path":77,"stem":78},"Reviewing a change","\u002Fguides\u002Fday-to-day\u002Freview-a-change","3.guides\u002F1.day-to-day\u002F5.review-a-change",{"title":80,"path":81,"stem":82},"Raise a cap on a stopped item","\u002Fguides\u002Fday-to-day\u002Fraise-a-cap","3.guides\u002F1.day-to-day\u002F6.raise-a-cap",{"title":84,"path":85,"stem":86},"Kraft for VS Code","\u002Fguides\u002Fday-to-day\u002Fvscode","3.guides\u002F1.day-to-day\u002F7.vscode",{"title":88,"path":89,"stem":90},"Kraft on a phone","\u002Fguides\u002Fday-to-day\u002Fkraft-on-a-phone","3.guides\u002F1.day-to-day\u002F8.kraft-on-a-phone",{"title":92,"path":93,"stem":94},"Get notified when an item needs you","\u002Fguides\u002Fday-to-day\u002Fnotifications","3.guides\u002F1.day-to-day\u002F9.notifications",false,{"title":97,"path":98,"stem":99,"children":100,"page":95},"Customize and automate","\u002Fguides\u002Fcustomize","3.guides\u002F2.customize",[101,105,109],{"title":102,"path":103,"stem":104},"Write your own chain","\u002Fguides\u002Fcustomize\u002Fwrite-your-own-chain","3.guides\u002F2.customize\u002F1.write-your-own-chain",{"title":106,"path":107,"stem":108},"Add a security review or a gate reviewer","\u002Fguides\u002Fcustomize\u002Fadd-review-agents","3.guides\u002F2.customize\u002F2.add-review-agents",{"title":110,"path":111,"stem":112},"Schedule or webhook work","\u002Fguides\u002Fcustomize\u002Fschedule-and-webhook-work","3.guides\u002F2.customize\u002F3.schedule-and-webhook-work",{"title":114,"path":115,"stem":116,"children":117,"page":95},"Agents and harnesses","\u002Fguides\u002Fharnesses","3.guides\u002F3.harnesses",[118,122,126,130],{"title":119,"path":120,"stem":121},"Switch a task to another harness","\u002Fguides\u002Fharnesses\u002Fswitch-harness","3.guides\u002F3.harnesses\u002F1.switch-harness",{"title":123,"path":124,"stem":125},"Add or override a harness","\u002Fguides\u002Fharnesses\u002Fadding-a-harness","3.guides\u002F3.harnesses\u002F2.adding-a-harness",{"title":127,"path":128,"stem":129},"Build a worker Kit","\u002Fguides\u002Fharnesses\u002Fworker-kit","3.guides\u002F3.harnesses\u002F3.worker-kit",{"title":131,"path":132,"stem":133},"Give a worker its login","\u002Fguides\u002Fharnesses\u002Fgive-a-worker-its-login","3.guides\u002F3.harnesses\u002F4.give-a-worker-its-login",{"title":135,"path":136,"stem":137,"children":138,"page":95},"Run the server","\u002Fguides\u002Frun","3.guides\u002F4.run",[139,143,147,151,155,159,163,167,171,175,179],{"title":140,"path":141,"stem":142},"Remote access","\u002Fguides\u002Frun\u002Fremote-access","3.guides\u002F4.run\u002F01.remote-access",{"title":144,"path":145,"stem":146},"Put a proxy in front of Kraft","\u002Fguides\u002Frun\u002Fput-a-proxy-in-front-of-kraft","3.guides\u002F4.run\u002F02.put-a-proxy-in-front-of-kraft",{"title":148,"path":149,"stem":150},"Restart Kraft without ending running agents","\u002Fguides\u002Frun\u002Frestart-kraft","3.guides\u002F4.run\u002F03.restart-kraft",{"title":152,"path":153,"stem":154},"Back up and restore the database","\u002Fguides\u002Frun\u002Fback-up-and-restore","3.guides\u002F4.run\u002F04.back-up-and-restore",{"title":156,"path":157,"stem":158},"Logs and disk space","\u002Fguides\u002Frun\u002Flogs-and-disk-space","3.guides\u002F4.run\u002F05.logs-and-disk-space",{"title":160,"path":161,"stem":162},"Run Kraft as a service","\u002Fguides\u002Frun\u002Frun-as-a-service","3.guides\u002F4.run\u002F06.run-as-a-service",{"title":164,"path":165,"stem":166},"Upgrade Kraft","\u002Fguides\u002Frun\u002Fupgrade-kraft","3.guides\u002F4.run\u002F07.upgrade-kraft",{"title":168,"path":169,"stem":170},"Upgrade your configuration","\u002Fguides\u002Frun\u002Fupgrade-your-configuration","3.guides\u002F4.run\u002F08.upgrade-your-configuration",{"title":172,"path":173,"stem":174},"Upgrade from 1.4","\u002Fguides\u002Frun\u002Fupgrade-from-1-4","3.guides\u002F4.run\u002F09.upgrade-from-1-4",{"title":176,"path":177,"stem":178},"Upgrade from 0.x or a release candidate","\u002Fguides\u002Frun\u002Fupgrade-from-0-x-or-a-release-candidate","3.guides\u002F4.run\u002F10.upgrade-from-0-x-or-a-release-candidate",{"title":180,"path":181,"stem":182},"Roll back to 1.4","\u002Fguides\u002Frun\u002Froll-back","3.guides\u002F4.run\u002F11.roll-back",{"title":184,"path":185,"stem":186},"Kraft Lite","\u002Fguides\u002Fkraft-lite","3.guides\u002F5.kraft-lite",{"title":188,"path":189,"stem":190,"children":191},"Troubleshooting","\u002Ftroubleshooting","4.troubleshooting",[192,194,198,202,206,210],{"title":10,"path":189,"stem":193},"4.troubleshooting\u002Findex",{"title":195,"path":196,"stem":197},"Why did my item stop?","\u002Ftroubleshooting\u002Fwhy-did-my-item-stop","4.troubleshooting\u002F1.why-did-my-item-stop",{"title":199,"path":200,"stem":201},"Stop reasons in detail","\u002Ftroubleshooting\u002Fstop-reasons-in-detail","4.troubleshooting\u002F2.stop-reasons-in-detail",{"title":203,"path":204,"stem":205},"Starting and reaching Kraft","\u002Ftroubleshooting\u002Fstarting-and-reaching-kraft","4.troubleshooting\u002F3.starting-and-reaching-kraft",{"title":207,"path":208,"stem":209},"Doctor failures","\u002Ftroubleshooting\u002Fdoctor-failures","4.troubleshooting\u002F4.doctor-failures",{"title":211,"path":212,"stem":213},"Sandbox and Kit stops","\u002Ftroubleshooting\u002Fsandbox-and-kit-stops","4.troubleshooting\u002F5.sandbox-and-kit-stops",{"title":215,"path":216,"stem":217,"children":218},"Reference","\u002Freference","5.reference",[219,221,259,281,285,375,393,419,423,427,461,465],{"title":10,"path":216,"stem":220},"5.reference\u002Findex",{"title":222,"path":223,"stem":224,"children":225},"Web UI","\u002Freference\u002Fweb-ui","5.reference\u002F00.web-ui\u002Findex",[226,227,231,235,239,243,247,251,255],{"title":10,"path":223,"stem":224},{"title":228,"path":229,"stem":230},"Sidebar, search, and keyboard","\u002Freference\u002Fweb-ui\u002Fsidebar-search-and-keyboard","5.reference\u002F00.web-ui\u002F0.sidebar-search-and-keyboard",{"title":232,"path":233,"stem":234},"The board","\u002Freference\u002Fweb-ui\u002Fboard","5.reference\u002F00.web-ui\u002F1.board",{"title":236,"path":237,"stem":238},"An item's page","\u002Freference\u002Fweb-ui\u002Fitem-page","5.reference\u002F00.web-ui\u002F2.item-page",{"title":240,"path":241,"stem":242},"Fix loops and test scopes","\u002Freference\u002Fweb-ui\u002Ffix-loops-and-test-scopes","5.reference\u002F00.web-ui\u002F3.fix-loops-and-test-scopes",{"title":244,"path":245,"stem":246},"Config before an item starts","\u002Freference\u002Fweb-ui\u002Fconfig-before-start","5.reference\u002F00.web-ui\u002F4.config-before-start",{"title":248,"path":249,"stem":250},"The review page","\u002Freference\u002Fweb-ui\u002Freview-page","5.reference\u002F00.web-ui\u002F5.review-page",{"title":252,"path":253,"stem":254},"Templates and Settings","\u002Freference\u002Fweb-ui\u002Ftemplates-and-settings","5.reference\u002F00.web-ui\u002F6.templates-and-settings",{"title":256,"path":257,"stem":258},"Analytics","\u002Freference\u002Fweb-ui\u002Fanalytics","5.reference\u002F00.web-ui\u002F7.analytics",{"title":260,"path":261,"stem":262,"children":263},"CLI","\u002Freference\u002Fcli","5.reference\u002F01.cli\u002Findex",[264,265,269,273,277],{"title":10,"path":261,"stem":262},{"title":266,"path":267,"stem":268},"Item verbs","\u002Freference\u002Fcli\u002Fitem","5.reference\u002F01.cli\u002F2.item",{"title":270,"path":271,"stem":272},"View verbs","\u002Freference\u002Fcli\u002Fview","5.reference\u002F01.cli\u002F3.view",{"title":274,"path":275,"stem":276},"Repo verbs","\u002Freference\u002Fcli\u002Frepo","5.reference\u002F01.cli\u002F4.repo",{"title":278,"path":279,"stem":280},"Admin verbs","\u002Freference\u002Fcli\u002Fadmin","5.reference\u002F01.cli\u002F5.admin",{"title":282,"path":283,"stem":284},"Work item statuses","\u002Freference\u002Fstatuses","5.reference\u002F02.statuses",{"title":286,"path":287,"stem":288,"children":289},"Configuration","\u002Freference\u002Fconfiguration","5.reference\u002F03.configuration\u002Findex",[290,291,309,313,317,321,325,329,333,337,371],{"title":10,"path":287,"stem":288},{"title":292,"path":293,"stem":294,"children":295},"repos.yaml","\u002Freference\u002Fconfiguration\u002Frepos","5.reference\u002F03.configuration\u002F02.repos\u002Findex",[296,297,301,305],{"title":10,"path":293,"stem":294},{"title":298,"path":299,"stem":300},"How connect proposes commands","\u002Freference\u002Fconfiguration\u002Frepos\u002Fconnect-proposals","5.reference\u002F03.configuration\u002F02.repos\u002F1.connect-proposals",{"title":302,"path":303,"stem":304},"detectors.yaml","\u002Freference\u002Fconfiguration\u002Frepos\u002Fdetectors","5.reference\u002F03.configuration\u002F02.repos\u002F2.detectors",{"title":306,"path":307,"stem":308},"Workspaces","\u002Freference\u002Fconfiguration\u002Frepos\u002Fworkspaces","5.reference\u002F03.configuration\u002F02.repos\u002F3.workspaces",{"title":310,"path":311,"stem":312},"policy.yaml","\u002Freference\u002Fconfiguration\u002Fpolicy","5.reference\u002F03.configuration\u002F03.policy",{"title":314,"path":315,"stem":316},"Library and chains","\u002Freference\u002Fconfiguration\u002Flibrary-and-chains","5.reference\u002F03.configuration\u002F04.library-and-chains",{"title":318,"path":319,"stem":320},"harnesses.yaml","\u002Freference\u002Fconfiguration\u002Fharnesses-file","5.reference\u002F03.configuration\u002F05.harnesses-file",{"title":322,"path":323,"stem":324},"access.yaml","\u002Freference\u002Fconfiguration\u002Faccess","5.reference\u002F03.configuration\u002F06.access",{"title":326,"path":327,"stem":328},"intake.yaml","\u002Freference\u002Fconfiguration\u002Fintake","5.reference\u002F03.configuration\u002F07.intake",{"title":330,"path":331,"stem":332},"notify.yaml","\u002Freference\u002Fconfiguration\u002Fnotify","5.reference\u002F03.configuration\u002F08.notify",{"title":334,"path":335,"stem":336},"theme.yaml","\u002Freference\u002Fconfiguration\u002Ftheme","5.reference\u002F03.configuration\u002F09.theme",{"title":338,"path":339,"stem":340,"children":341},"Sandboxed workers","\u002Freference\u002Fconfiguration\u002Fsandbox","5.reference\u002F03.configuration\u002F10.sandbox\u002Findex",[342,343,347,351,355,359,363,367],{"title":10,"path":339,"stem":340},{"title":344,"path":345,"stem":346},"Resource limits","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fresource-limits","5.reference\u002F03.configuration\u002F10.sandbox\u002F1.resource-limits",{"title":348,"path":349,"stem":350},"Callbacks from a sandbox","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fcallbacks","5.reference\u002F03.configuration\u002F10.sandbox\u002F2.callbacks",{"title":352,"path":353,"stem":354},"Network policy","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fnetwork-policy","5.reference\u002F03.configuration\u002F10.sandbox\u002F3.network-policy",{"title":356,"path":357,"stem":358},"Credentials","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fcredentials","5.reference\u002F03.configuration\u002F10.sandbox\u002F4.credentials",{"title":360,"path":361,"stem":362},"Kits","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fkits","5.reference\u002F03.configuration\u002F10.sandbox\u002F5.kits",{"title":364,"path":365,"stem":366},"sandbox.yaml","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fsandbox-yaml","5.reference\u002F03.configuration\u002F10.sandbox\u002F6.sandbox-yaml",{"title":368,"path":369,"stem":370},"Git in a sandbox","\u002Freference\u002Fconfiguration\u002Fsandbox\u002Fgit-in-a-sandbox","5.reference\u002F03.configuration\u002F10.sandbox\u002F7.git-in-a-sandbox",{"title":372,"path":373,"stem":374},"Environment variables","\u002Freference\u002Fconfiguration\u002Fenvironment-variables","5.reference\u002F03.configuration\u002F11.environment-variables",{"title":376,"path":377,"stem":378,"children":379},"Chain file keys","\u002Freference\u002Fchain-nodes","5.reference\u002F04.chain-nodes\u002Findex",[380,381,385,389],{"title":10,"path":377,"stem":378},{"title":382,"path":383,"stem":384},"Subprocess tasks","\u002Freference\u002Fchain-nodes\u002Fsubprocess-tasks","5.reference\u002F04.chain-nodes\u002F2.subprocess-tasks",{"title":386,"path":387,"stem":388},"Fix loop and judge","\u002Freference\u002Fchain-nodes\u002Ffix-loop","5.reference\u002F04.chain-nodes\u002F3.fix-loop",{"title":390,"path":391,"stem":392},"Result file","\u002Freference\u002Fchain-nodes\u002Fresult-file","5.reference\u002F04.chain-nodes\u002F4.result-file",{"title":394,"path":395,"stem":396,"children":397},"Agent harnesses","\u002Freference\u002Fharnesses","5.reference\u002F05.harnesses\u002Findex",[398,399,403,407,411,415],{"title":10,"path":395,"stem":396},{"title":400,"path":401,"stem":402},"Unattended runs","\u002Freference\u002Fharnesses\u002Funattended-runs","5.reference\u002F05.harnesses\u002F2.unattended-runs",{"title":404,"path":405,"stem":406},"Agent profiles","\u002Freference\u002Fharnesses\u002Fagent-profiles","5.reference\u002F05.harnesses\u002F3.agent-profiles",{"title":408,"path":409,"stem":410},"Harness definition files","\u002Freference\u002Fharnesses\u002Fharness-files","5.reference\u002F05.harnesses\u002F4.harness-files",{"title":412,"path":413,"stem":414},"Fallback and escalation","\u002Freference\u002Fharnesses\u002Ffallback-and-escalation","5.reference\u002F05.harnesses\u002F5.fallback-and-escalation",{"title":416,"path":417,"stem":418},"Cost reporting","\u002Freference\u002Fharnesses\u002Fcost-reporting","5.reference\u002F05.harnesses\u002F6.cost-reporting",{"title":420,"path":421,"stem":422},"Permission gate","\u002Freference\u002Fpermissions","5.reference\u002F06.permissions",{"title":424,"path":425,"stem":426},"Inbound triggers","\u002Freference\u002Ftriggers","5.reference\u002F07.triggers",{"title":428,"path":429,"stem":430,"children":431},"HTTP API","\u002Freference\u002Fhttp-api","5.reference\u002F08.http-api\u002Findex",[432,433,437,441,445,449,453,457],{"title":10,"path":429,"stem":430},{"title":434,"path":435,"stem":436},"Filing, reading and changing work items","\u002Freference\u002Fhttp-api\u002Fwork-items","5.reference\u002F08.http-api\u002F2.work-items",{"title":438,"path":439,"stem":440},"Gates, run control, ending and retry","\u002Freference\u002Fhttp-api\u002Fgates-run-control-and-ending","5.reference\u002F08.http-api\u002F3.gates-run-control-and-ending",{"title":442,"path":443,"stem":444},"The work item object","\u002Freference\u002Fhttp-api\u002Fwork-item-object","5.reference\u002F08.http-api\u002F4.work-item-object",{"title":446,"path":447,"stem":448},"Budget, events, diff and documents","\u002Freference\u002Fhttp-api\u002Fbudget-and-events","5.reference\u002F08.http-api\u002F5.budget-and-events",{"title":450,"path":451,"stem":452},"Repos, chains, harnesses and the server","\u002Freference\u002Fhttp-api\u002Frepos-chains-harnesses-and-server","5.reference\u002F08.http-api\u002F6.repos-chains-harnesses-and-server",{"title":454,"path":455,"stem":456},"Drafts","\u002Freference\u002Fhttp-api\u002Fdrafts","5.reference\u002F08.http-api\u002F7.drafts",{"title":458,"path":459,"stem":460},"Ops for each draft area","\u002Freference\u002Fhttp-api\u002Fdraft-ops","5.reference\u002F08.http-api\u002F8.draft-ops",{"title":462,"path":463,"stem":464},"MCP tools","\u002Freference\u002Fmcp-tools","5.reference\u002F09.mcp-tools",{"title":466,"path":467,"stem":468},"Events","\u002Freference\u002Fevents","5.reference\u002F10.events",{"title":470,"path":471,"stem":472,"children":473},"Security and project","\u002Fproject","6.project",[474,476,480,484,488,492,496,500],{"title":10,"path":471,"stem":475},"6.project\u002Findex",{"title":477,"path":478,"stem":479},"Security","\u002Fproject\u002Fsecurity","6.project\u002F1.security",{"title":481,"path":482,"stem":483},"Data and privacy","\u002Fproject\u002Fdata-and-privacy","6.project\u002F2.data-and-privacy",{"title":485,"path":486,"stem":487},"What's new in 2.0","\u002Fproject\u002Fwhats-new","6.project\u002F3.whats-new",{"title":489,"path":490,"stem":491},"Status and support","\u002Fproject\u002Fstatus-and-support","6.project\u002F4.status-and-support",{"title":493,"path":494,"stem":495},"Architecture","\u002Fproject\u002Farchitecture","6.project\u002F5.architecture",{"title":497,"path":498,"stem":499},"Source map","\u002Fproject\u002Fsource-map","6.project\u002F6.source-map",{"title":501,"path":502,"stem":503},"Contributing","\u002Fproject\u002Fcontributing","6.project\u002F7.contributing",{"id":505,"title":123,"body":506,"description":1075,"extension":1076,"links":1077,"meta":1078,"navigation":1079,"path":124,"seo":1080,"stem":125,"__hash__":1081},"docs\u002F3.guides\u002F3.harnesses\u002F2.adding-a-harness.md",{"type":507,"value":508,"toc":1068},"minimark",[509,519,524,547,551,927,931,956,975,979,993,1000,1011,1043,1047,1064],[510,511,512,513,518],"p",{},"Add a new agent CLI to Kraft, or change how a shipped one is launched, by dropping a YAML file into a directory. No Python change and no Kraft release are involved. At the end, a chain task runs on your ",[514,515,517],"a",{"href":516},"\u002Fconcepts\u002Fvocabulary#harness","harness",".",[520,521,523],"h2",{"id":522},"before-you-start","Before you start",[525,526,527,536,539],"ul",{},[528,529,530,531,535],"li",{},"The CLI is installed, on the ",[532,533,534],"code",{},"PATH"," of the shell that starts Kraft, and you can run it headless by hand.",[528,537,538],{},"You know its flags for a prompt, and for each option you want Kraft to set (a model, an effort, a permission mode).",[528,540,541,542,546],{},"You know how it reports tokens: in a log one of ",[514,543,545],{"href":544},"\u002Freference\u002Fharnesses\u002Fharness-files#log-readers","Kraft's readers"," parses, or in a file the agent writes.",[520,548,550],{"id":549},"add-a-harness","Add a harness",[552,553,554,572,733,812,886,897],"ol",{},[528,555,556,557,560,561,564,565,568,569,518],{},"Create ",[532,558,559],{},"$KRAFT_HOME\u002Fconfig\u002Fharnesses\u002Fmytool.yaml"," (",[532,562,563],{},"~\u002F.kraft\u002Fconfig\u002Fharnesses\u002F"," by default). Make the directory if it does not exist. The file name without ",[532,566,567],{},".yaml"," must equal the ",[532,570,571],{},"id",[528,573,574,575,716,719,723,724,663,726,728,729,732],{},"Start with the three required capabilities:",[576,577,583],"pre",{"className":578,"code":579,"filename":580,"language":581,"meta":582,"style":582},"language-yaml shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","id: mytool          # must match the file name without .yaml\nkind: cli           # the only kind implemented\ncommand: [mytool]   # the command and its fixed arguments\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","config\u002Fharnesses\u002Fmytool.yaml","yaml","",[532,584,585,605,619,636,645,670,693],{"__ignoreMap":582},[586,587,590,593,597,601],"span",{"class":588,"line":589},"line",1,[586,591,571],{"class":592},"sb7M8",[586,594,596],{"class":595},"s7iLA",": ",[586,598,600],{"class":599},"semJd","mytool",[586,602,604],{"class":603},"sq92B","          # must match the file name without .yaml\n",[586,606,608,611,613,616],{"class":588,"line":607},2,[586,609,610],{"class":592},"kind",[586,612,596],{"class":595},[586,614,615],{"class":599},"cli",[586,617,618],{"class":603},"           # the only kind implemented\n",[586,620,622,625,628,630,633],{"class":588,"line":621},3,[586,623,624],{"class":592},"command",[586,626,627],{"class":595},": [",[586,629,600],{"class":599},[586,631,632],{"class":595},"]   ",[586,634,635],{"class":603},"# the command and its fixed arguments\n",[586,637,639,642],{"class":588,"line":638},4,[586,640,641],{"class":592},"capabilities",[586,643,644],{"class":595},":\n",[586,646,648,651,654,656,658,661,664,667],{"class":588,"line":647},5,[586,649,650],{"class":592},"  prompt",[586,652,653],{"class":595},":  { ",[586,655,615],{"class":592},[586,657,627],{"class":595},[586,659,660],{"class":599},"\"-p\"",[586,662,663],{"class":595},", ",[586,665,666],{"class":599},"\"{value}\"",[586,668,669],{"class":595},"] }\n",[586,671,673,676,679,682,684,687,690],{"class":588,"line":672},6,[586,674,675],{"class":592},"  context",[586,677,678],{"class":595},": { ",[586,680,681],{"class":592},"channel",[586,683,596],{"class":595},[586,685,686],{"class":599},"prompt",[586,688,689],{"class":595}," }       ",[586,691,692],{"class":603},"# or: { channel: system_prompt, cli: [...] }\n",[586,694,696,699,702,705,707,710,713],{"class":588,"line":695},7,[586,697,698],{"class":592},"  usage",[586,700,701],{"class":595},":   { ",[586,703,704],{"class":592},"source",[586,706,596],{"class":595},[586,708,709],{"class":599},"result_file",[586,711,712],{"class":595}," }   ",[586,714,715],{"class":603},"# or: { source: envelope, reader: \u003Cparser name> }\n",[717,718],"br",{},[514,720,722],{"href":721},"\u002Freference\u002Fharnesses\u002Fharness-files#capabilities","Capabilities"," defines each one and the ",[532,725,681],{},[532,727,704],{}," and ",[532,730,731],{},"reader"," keys.",[528,734,735,736,739,740,728,743,746,747,750,751],{},"Add each optional capability the CLI supports, with the ",[532,737,738],{},"cli:"," fragment that sets it. Leave out what the CLI cannot do. A task that asks for a capability you left out is rejected at load, pointing at this file. For a CLI with ",[532,741,742],{},"--model",[532,744,745],{},"--effort"," flags, add these two lines under ",[532,748,749],{},"capabilities:",":",[576,752,754],{"className":578,"code":753,"filename":580,"language":581,"meta":582,"style":582},"  model:   { cli: [\"--model\", \"{value}\"] }\n  effort:  { cli: [\"--effort\", \"{value}\"], values: [low, high] }\n",[532,755,756,776],{"__ignoreMap":582},[586,757,758,761,763,765,767,770,772,774],{"class":588,"line":589},[586,759,760],{"class":592},"  model",[586,762,701],{"class":595},[586,764,615],{"class":592},[586,766,627],{"class":595},[586,768,769],{"class":599},"\"--model\"",[586,771,663],{"class":595},[586,773,666],{"class":599},[586,775,669],{"class":595},[586,777,778,781,783,785,787,790,792,794,797,800,802,805,807,810],{"class":588,"line":607},[586,779,780],{"class":592},"  effort",[586,782,653],{"class":595},[586,784,615],{"class":592},[586,786,627],{"class":595},[586,788,789],{"class":599},"\"--effort\"",[586,791,663],{"class":595},[586,793,666],{"class":599},[586,795,796],{"class":595},"], ",[586,798,799],{"class":592},"values",[586,801,627],{"class":595},[586,803,804],{"class":599},"low",[586,806,663],{"class":595},[586,808,809],{"class":599},"high",[586,811,669],{"class":595},[528,813,814,815,819,820,823,824,827,828,830,831,835,836],{},"Add a ",[514,816,818],{"href":817},"\u002Fconcepts\u002Fvocabulary#harness-profile","harness profile"," for the harness in ",[532,821,822],{},"~\u002F.kraft\u002Fconfig\u002Fharnesses.yaml",". The profile's ",[532,825,826],{},"provider"," is your harness ",[532,829,571],{},". See ",[514,832,833],{"href":319},[532,834,318],{}," for every profile field.",[576,837,840],{"className":578,"code":838,"filename":839,"language":581,"meta":582,"style":582},"harnesses:\n  mytool:\n    provider: mytool\n    enabled: true\n    executable: mytool\n","config\u002Fharnesses.yaml",[532,841,842,849,856,866,877],{"__ignoreMap":582},[586,843,844,847],{"class":588,"line":589},[586,845,846],{"class":592},"harnesses",[586,848,644],{"class":595},[586,850,851,854],{"class":588,"line":607},[586,852,853],{"class":592},"  mytool",[586,855,644],{"class":595},[586,857,858,861,863],{"class":588,"line":621},[586,859,860],{"class":592},"    provider",[586,862,596],{"class":595},[586,864,865],{"class":599},"mytool\n",[586,867,868,871,873],{"class":588,"line":638},[586,869,870],{"class":592},"    enabled",[586,872,596],{"class":595},[586,874,876],{"class":875},"ssYy9","true\n",[586,878,879,882,884],{"class":588,"line":647},[586,880,881],{"class":592},"    executable",[586,883,596],{"class":595},[586,885,865],{"class":599},[528,887,888,889,892,893,896],{},"In ",[532,890,891],{},"library.yaml",", set ",[532,894,895],{},"harness: mytool"," on a task that should run on it.",[528,898,899,900,750,902,921,923,924,926],{},"Reload so a running server rereads ",[532,901,891],{},[576,903,907],{"className":904,"code":905,"language":906,"meta":582,"style":582},"language-bash shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","kraft admin reload\n","bash",[532,908,909],{"__ignoreMap":582},[586,910,911,915,918],{"class":588,"line":589},[586,912,914],{"class":913},"szw1H","kraft",[586,916,917],{"class":599}," admin",[586,919,920],{"class":599}," reload\n",[717,922],{},"Kraft reads ",[532,925,318],{}," and the harness file again at every agent launch, so those two need no reload.",[520,928,930],{"id":929},"override-a-shipped-harness","Override a shipped harness",[510,932,933,934,663,937,663,940,663,943,663,946,663,949,952,953,518],{},"Use the same steps, with a file named after a shipped harness: ",[532,935,936],{},"claude.yaml",[532,938,939],{},"codex.yaml",[532,941,942],{},"cursor.yaml",[532,944,945],{},"opencode.yaml",[532,947,948],{},"gemini.yaml",[532,950,951],{},"antigravity.yaml",", or ",[532,954,955],{},"amp.yaml",[510,957,958,959,967,968,970,971,974],{},"Your file replaces the shipped one entirely. Copy the shipped definition from ",[514,960,964],{"href":961,"rel":962},"https:\u002F\u002Fgithub.com\u002FitsOmidKarami\u002Fkraft\u002Ftree\u002Fmain\u002Fsrc\u002Fkraft\u002Fharnesses",[963],"nofollow",[532,965,966],{},"src\u002Fkraft\u002Fharnesses\u002F"," (one file per harness) and change only what you need. For example, edit ",[532,969,936],{}," to change which ",[532,972,973],{},"effort"," values it allows.",[520,976,978],{"id":977},"check-it-worked","Check it worked",[576,980,982],{"className":904,"code":981,"language":906,"meta":582,"style":582},"kraft admin doctor\n",[532,983,984],{"__ignoreMap":582},[586,985,986,988,990],{"class":588,"line":589},[586,987,914],{"class":913},[586,989,917],{"class":599},[586,991,992],{"class":599}," doctor\n",[510,994,995,996,999],{},"Once a chain selects your harness profile, the output has an ",[532,997,998],{},"agent: mytool"," row that gives the path where Kraft found the executable. Kraft pads the name column to the widest check name:",[576,1001,1006],{"className":1002,"code":1004,"language":1005,"meta":582},[1003],"language-text","ok    agent: mytool  \u002Fusr\u002Flocal\u002Fbin\u002Fmytool\n","text",[532,1007,1008],{"__ignoreMap":582},[586,1009,1004],{"className":1010},[588],[525,1012,1013,1019,1025,1028],{},[528,1014,1015,1016,1018],{},"A failing ",[532,1017,895],{}," row means your file did not load. Its detail names the file and the field to fix.",[528,1020,1021,1024],{},[532,1022,1023],{},"kraft admin harnesses"," lists the library tasks that select each harness profile.",[528,1026,1027],{},"File a small work item on a chain that selects the harness profile, and confirm the task runs on it.",[528,1029,1030,1031,1035,1036,1038,1039,518],{},"If the task cannot log in, give the CLI credentials a ",[514,1032,1034],{"href":1033},"\u002Fconcepts\u002Fvocabulary#worker","worker"," can use. ",[514,1037,131],{"href":132}," has each harness's login, and ",[514,1040,1042],{"href":1041},"\u002Fguides\u002Fharnesses\u002Fgive-a-worker-its-login#check-it-worked","how to check a worker can log in",[520,1044,1046],{"id":1045},"next-steps","Next steps",[525,1048,1049,1054,1059],{},[528,1050,1051,1053],{},[514,1052,408],{"href":409},": every field of the file you wrote.",[528,1055,1056,1058],{},[514,1057,119],{"href":120},": move tasks to a harness, including the model tiers each needs.",[528,1060,1061,1063],{},[514,1062,394],{"href":395},": the seven shipped harnesses, to copy a definition from.",[1065,1066,1067],"style",{},"html pre.shiki code .sb7M8, html code.shiki .sb7M8{--shiki-light:#024C1A;--shiki-default:#024C1A;--shiki-dark:#72F088}html pre.shiki code .s7iLA, html code.shiki .s7iLA{--shiki-light:#0E1116;--shiki-default:#0E1116;--shiki-dark:#F0F3F6}html pre.shiki code .semJd, html code.shiki .semJd{--shiki-light:#032563;--shiki-default:#032563;--shiki-dark:#ADDCFF}html pre.shiki code .sq92B, html code.shiki .sq92B{--shiki-light:#66707B;--shiki-default:#66707B;--shiki-dark:#BDC4CC}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 .ssYy9, html code.shiki .ssYy9{--shiki-light:#023B95;--shiki-default:#023B95;--shiki-dark:#91CBFF}html pre.shiki code .szw1H, html code.shiki .szw1H{--shiki-light:#702C00;--shiki-default:#702C00;--shiki-dark:#FFB757}",{"title":582,"searchDepth":607,"depth":607,"links":1069},[1070,1071,1072,1073,1074],{"id":522,"depth":607,"text":523},{"id":549,"depth":607,"text":550},{"id":929,"depth":607,"text":930},{"id":977,"depth":607,"text":978},{"id":1045,"depth":607,"text":1046},"Add an agent CLI to Kraft with a YAML file, and override a shipped one.","md",null,{},true,{"title":123,"description":1075},"DKseWGitZXAcNmCseSitZ5AlKOWuV5jt5Ba9H1Ljz1M",[1083,1085],{"title":119,"path":120,"stem":121,"description":1084,"children":-1},"Run some or all of a chain's agent tasks on Codex, Cursor, OpenCode, Gemini, Antigravity or Amp instead of Claude Code, and what changes when you do.",{"title":127,"path":128,"stem":129,"description":1086,"children":-1},"Build a Docker Sandbox Kit for Kraft's Claude workers, push it to your registry, and run a repository's sandbox from it, pinned by digest.",1791801240379]