[{"data":1,"prerenderedAt":2435},["ShallowReactive",2],{"navigation_docs":3,"-reference-harnesses-harness-files":504,"-reference-harnesses-harness-files-surround":2430},[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":408,"body":506,"description":2423,"extension":2424,"links":2425,"meta":2426,"navigation":2427,"path":409,"seo":2428,"stem":410,"__hash__":2429},"docs\u002F5.reference\u002F05.harnesses\u002F4.harness-files.md",{"type":507,"value":508,"toc":2401},"minimark",[509,519,705,715,720,860,863,895,898,1265,1276,1279,1285,1311,1324,1343,1345,1357,1401,1411,1415,1418,1638,1642,1925,1927,1937,2034,2058,2061,2097,2100,2126,2128,2135,2158,2162,2193,2196,2225,2231,2234,2310,2313,2319,2357,2361,2371,2375,2397],[510,511,512,513,518],"p",{},"A ",[514,515,517],"a",{"href":516},"\u002Fconcepts\u002Fvocabulary#harness","harness"," file maps Kraft's capabilities onto one CLI's flags. This page lists the fields of that file and the sixteen capabilities it can declare.",[520,521,527],"pre",{"className":522,"code":523,"filename":524,"language":525,"meta":526,"style":526},"language-yaml shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","id: mytool\nkind: cli\ncommand: [mytool]\ncapabilities:\n  prompt:  { cli: [\"-p\", \"{value}\"] }\n  context: { channel: prompt }\n  usage:   { source: result_file }\n  model:   { cli: [\"--model\", \"{value}\"] }\n  effort:  { cli: [\"--effort\", \"{value}\"], values: [low, high] }\n","config\u002Fharnesses\u002Fmytool.yaml","yaml","",[528,529,530,547,558,573,582,608,628,647,668],"code",{"__ignoreMap":526},[531,532,535,539,543],"span",{"class":533,"line":534},"line",1,[531,536,538],{"class":537},"sb7M8","id",[531,540,542],{"class":541},"s7iLA",": ",[531,544,546],{"class":545},"semJd","mytool\n",[531,548,550,553,555],{"class":533,"line":549},2,[531,551,552],{"class":537},"kind",[531,554,542],{"class":541},[531,556,557],{"class":545},"cli\n",[531,559,561,564,567,570],{"class":533,"line":560},3,[531,562,563],{"class":537},"command",[531,565,566],{"class":541},": [",[531,568,569],{"class":545},"mytool",[531,571,572],{"class":541},"]\n",[531,574,576,579],{"class":533,"line":575},4,[531,577,578],{"class":537},"capabilities",[531,580,581],{"class":541},":\n",[531,583,585,588,591,594,596,599,602,605],{"class":533,"line":584},5,[531,586,587],{"class":537},"  prompt",[531,589,590],{"class":541},":  { ",[531,592,593],{"class":537},"cli",[531,595,566],{"class":541},[531,597,598],{"class":545},"\"-p\"",[531,600,601],{"class":541},", ",[531,603,604],{"class":545},"\"{value}\"",[531,606,607],{"class":541},"] }\n",[531,609,611,614,617,620,622,625],{"class":533,"line":610},6,[531,612,613],{"class":537},"  context",[531,615,616],{"class":541},": { ",[531,618,619],{"class":537},"channel",[531,621,542],{"class":541},[531,623,624],{"class":545},"prompt",[531,626,627],{"class":541}," }\n",[531,629,631,634,637,640,642,645],{"class":533,"line":630},7,[531,632,633],{"class":537},"  usage",[531,635,636],{"class":541},":   { ",[531,638,639],{"class":537},"source",[531,641,542],{"class":541},[531,643,644],{"class":545},"result_file",[531,646,627],{"class":541},[531,648,650,653,655,657,659,662,664,666],{"class":533,"line":649},8,[531,651,652],{"class":537},"  model",[531,654,636],{"class":541},[531,656,593],{"class":537},[531,658,566],{"class":541},[531,660,661],{"class":545},"\"--model\"",[531,663,601],{"class":541},[531,665,604],{"class":545},[531,667,607],{"class":541},[531,669,671,674,676,678,680,683,685,687,690,693,695,698,700,703],{"class":533,"line":670},9,[531,672,673],{"class":537},"  effort",[531,675,590],{"class":541},[531,677,593],{"class":537},[531,679,566],{"class":541},[531,681,682],{"class":545},"\"--effort\"",[531,684,601],{"class":541},[531,686,604],{"class":545},[531,688,689],{"class":541},"], ",[531,691,692],{"class":537},"values",[531,694,566],{"class":541},[531,696,697],{"class":545},"low",[531,699,601],{"class":541},[531,701,702],{"class":545},"high",[531,704,607],{"class":541},[510,706,707,708,711,712,714],{},"A file in ",[528,709,710],{},"$KRAFT_HOME\u002Fconfig\u002Fharnesses\u002F"," with the same name as a shipped harness overrides it. A file with a new name adds a harness. That directory is not seeded on first run, so it exists only once you put a file in it. To write one, follow ",[514,713,123],{"href":124},".",[716,717,719],"h2",{"id":718},"required-fields","Required fields",[721,722,723,742],"table",{},[724,725,726],"thead",{},[727,728,729,733,736,739],"tr",{},[730,731,732],"th",{},"Field",[730,734,735],{},"Type",[730,737,738],{},"Default",[730,740,741],{},"Meaning",[743,744,745,764,778,795,813,837],"tbody",{},[727,746,747,752,755,758],{},[748,749,750],"td",{},[528,751,538],{},[748,753,754],{},"string",[748,756,757],{},"required",[748,759,760,761,714],{},"Must match the file name without ",[528,762,763],{},".yaml",[727,765,766,770,772,774],{},[748,767,768],{},[528,769,552],{},[748,771,754],{},[748,773,757],{},[748,775,776,714],{},[528,777,593],{},[727,779,780,784,787,789],{},[748,781,782],{},[528,783,563],{},[748,785,786],{},"string or list of strings",[748,788,757],{},[748,790,791,792,714],{},"The argv prefix, such as ",[528,793,794],{},"[mytool]",[727,796,797,802,805,807],{},[748,798,799],{},[528,800,801],{},"capabilities.prompt",[748,803,804],{},"mapping",[748,806,757],{},[748,808,512,809,812],{},[528,810,811],{},"cli:"," argv fragment.",[727,814,815,820,822,824],{},[748,816,817],{},[528,818,819],{},"capabilities.context",[748,821,804],{},[748,823,757],{},[748,825,826,829,830,833,834,836],{},[528,827,828],{},"channel: prompt",", or ",[528,831,832],{},"channel: system_prompt"," with a ",[528,835,811],{}," fragment.",[727,838,839,844,846,848],{},[748,840,841],{},[528,842,843],{},"capabilities.usage",[748,845,804],{},[748,847,757],{},[748,849,850,829,853,856,857,714],{},[528,851,852],{},"source: result_file",[528,854,855],{},"source: envelope"," with the name of a ",[528,858,859],{},"reader:",[716,861,862],{"id":578},"Capabilities",[510,864,865,866,601,868,871,872,875,876,878,879,883,884,886,887,890,891,894],{},"Every capability other than ",[528,867,624],{},[528,869,870],{},"context"," and ",[528,873,874],{},"usage"," is optional. A task or a ",[528,877,318],{}," ",[514,880,882],{"href":881},"\u002Fconcepts\u002Fvocabulary#harness-profile","harness profile"," that sets an option whose capability the file omits is rejected when the chain or ",[528,885,318],{}," loads (",[528,888,889],{},"kraft admin templates lint"," shows it). A repository's ",[528,892,893],{},"models:"," entry that does is refused at launch, naming this file.",[510,896,897],{},"A task's YAML never names a CLI flag. It asks for a capability, and the harness file maps it to whatever the CLI calls it.",[721,899,900,915],{},[724,901,902],{},[727,903,904,907,910,912],{},[730,905,906],{},"Capability",[730,908,909],{},"Kind",[730,911,741],{},[730,913,914],{},"Shipped on",[743,916,917,932,962,976,994,1012,1042,1083,1110,1130,1146,1162,1183,1209,1240],{},[727,918,919,923,926,929],{},[748,920,921],{},[528,922,624],{},[748,924,925],{},"Required, sent",[748,927,928],{},"The task's instruction.",[748,930,931],{},"all seven",[727,933,934,938,940,949],{},[748,935,936],{},[528,937,870],{},[748,939,925],{},[748,941,942,943,945,946,948],{},"Kraft's context for the session. ",[528,944,832],{}," is out of band; ",[528,947,828],{}," folds it into the prompt text.",[748,950,951,952,955,956,871,959],{},"all seven; ",[528,953,954],{},"system_prompt"," on ",[528,957,958],{},"claude",[528,960,961],{},"codex",[727,963,964,968,971,974],{},[748,965,966],{},[528,967,874],{},[748,969,970],{},"Required, read back",[748,972,973],{},"The session's tokens and cost, from the result file or from the log.",[748,975,931],{},[727,977,978,983,986,992],{},[748,979,980],{},[528,981,982],{},"structured_log",[748,984,985],{},"Sent",[748,987,988,989,991],{},"The flag that makes the CLI write the log a ",[528,990,859],{}," parses.",[748,993,931],{},[727,995,996,1001,1003,1006],{},[748,997,998],{},[528,999,1000],{},"model",[748,1002,985],{},[748,1004,1005],{},"The model.",[748,1007,1008,1009],{},"all but ",[528,1010,1011],{},"amp",[727,1013,1014,1019,1021,1031],{},[748,1015,1016],{},[528,1017,1018],{},"effort",[748,1020,985],{},[748,1022,1023,1024,1026,1027,1030],{},"The reasoning effort. On ",[528,1025,1011],{},", its mode (",[528,1028,1029],{},"-m",").",[748,1032,1033,601,1035,601,1037,601,1040],{},[528,1034,958],{},[528,1036,961],{},[528,1038,1039],{},"antigravity",[528,1041,1011],{},[727,1043,1044,1049,1051,1079],{},[748,1045,1046],{},[528,1047,1048],{},"permission_mode",[748,1050,985],{},[748,1052,1053,1054,1058,1059,1062,1063,1066,1067,1070,1071,1074,1075,1078],{},"The CLI's approval or ",[514,1055,1057],{"href":1056},"\u002Fconcepts\u002Fvocabulary#sandbox","sandbox"," mode: ",[528,1060,1061],{},"--permission-mode"," on Claude, ",[528,1064,1065],{},"-c sandbox_mode="," on Codex, ",[528,1068,1069],{},"--approval-mode"," on Gemini, ",[528,1072,1073],{},"--auto-review"," or ",[528,1076,1077],{},"--force"," on Cursor.",[748,1080,1008,1081],{},[528,1082,1011],{},[727,1084,1085,1093,1096,1103],{},[748,1086,1087,601,1090],{},[528,1088,1089],{},"deny_tools",[528,1091,1092],{},"allowed_tools",[748,1094,1095],{},"Sent, or enforced by a hook or rules",[748,1097,1098,1099,714],{},"The task's tool lists. See ",[514,1100,1102],{"href":1101},"#constraints-and-alternate-bindings","Constraints and alternate bindings",[748,1104,1008,1105,871,1108],{},[528,1106,1107],{},"gemini",[528,1109,1039],{},[727,1111,1112,1117,1119,1126],{},[748,1113,1114],{},[528,1115,1116],{},"restrict_tools",[748,1118,985],{},[748,1120,1121,1122,714],{},"The CLI's own flag for which built-in tools exist. See ",[514,1123,1125],{"href":1124},"#allowlists","Allowlists",[748,1127,1128],{},[528,1129,958],{},[727,1131,1132,1137,1139,1142],{},[748,1133,1134],{},[528,1135,1136],{},"approval_channel",[748,1138,985],{},[748,1140,1141],{},"Hands the CLI's permission asks to Kraft's MCP permission tool.",[748,1143,1144],{},[528,1145,958],{},[727,1147,1148,1153,1155,1158],{},[748,1149,1150],{},[528,1151,1152],{},"resume",[748,1154,985],{},[748,1156,1157],{},"Continues an earlier session by id.",[748,1159,1008,1160],{},[528,1161,1107],{},[727,1163,1164,1169,1172,1179],{},[748,1165,1166],{},[528,1167,1168],{},"autocompact",[748,1170,1171],{},"Filled by Kraft",[748,1173,1174,1175,714],{},"The CLI's own context auto-compaction. Kraft sets it on an ",[514,1176,1178],{"href":1177},"\u002Fconcepts\u002Fvocabulary#escalation-turn","escalation turn",[748,1180,1181],{},[528,1182,958],{},[727,1184,1185,1190,1193,1198],{},[748,1186,1187],{},[528,1188,1189],{},"rate_limit_signal",[748,1191,1192],{},"Read back",[748,1194,1195,1196,714],{},"Tells Kraft a launch was rate-limited. See ",[514,1197,412],{"href":413},[748,1199,1200,601,1202,601,1204,601,1207],{},[528,1201,958],{},[528,1203,961],{},[528,1205,1206],{},"opencode",[528,1208,1039],{},[727,1210,1211,1216,1218,1236],{},[748,1212,1213],{},[528,1214,1215],{},"writable_dirs",[748,1217,1171],{},[748,1219,1220,1221,1225,1226,1230,1231,714],{},"Directories outside the ",[514,1222,1224],{"href":1223},"\u002Fconcepts\u002Fvocabulary#worktree","worktree"," that the ",[514,1227,1229],{"href":1228},"\u002Fconcepts\u002Fvocabulary#worker","worker"," must write. See ",[514,1232,1234],{"href":1233},"#writable_dirs",[528,1235,1215],{},[748,1237,1238],{},[528,1239,961],{},[727,1241,1242,1247,1249,1261],{},[748,1243,1244],{},[528,1245,1246],{},"mcp_config",[748,1248,1171],{},[748,1250,1251,1252,1255,1256,714],{},"The CLI's MCP servers for a sandboxed launch with ",[528,1253,1254],{},"network:",". See ",[514,1257,1259],{"href":1258},"#mcp_config",[528,1260,1246],{},[748,1262,1263],{},[528,1264,958],{},[510,1266,1267,1268,871,1270,1272,1273,1275],{},"Two capabilities need no argv: ",[528,1269,874],{},[528,1271,1189],{}," describe what Kraft reads back, so they are legal with no ",[528,1274,811],{}," binding.",[1277,1278,1215],"h3",{"id":1215},[510,1280,1281,1282,1284],{},"Kraft fills ",[528,1283,1215],{}," for a launch, and a task never sets it. It lists the directories outside the worktree that a worker must write:",[1286,1287,1288,1300],"ul",{},[1289,1290,1291,1292,1295,1296,1299],"li",{},"the directory holding the launch's ",[528,1293,1294],{},"$KRAFT_RESULT_PATH"," (",[528,1297,1298],{},"$KRAFT_HOME\u002Frun\u002Fresults",");",[1289,1301,1302,1303,1306,1307,1310],{},"the worktree's git common dir, where every commit writes. For a linked worktree that is the main checkout's ",[528,1304,1305],{},".git",". Kraft asks git for it (",[528,1308,1309],{},"git rev-parse --git-common-dir",") and leaves it out when git has none.",[510,1312,1313,1316,1317,1320,1321,1323],{},[528,1314,1315],{},"{value}"," is one JSON array of absolute paths, such as ",[528,1318,1319],{},"[\"\u002Fhome\u002Fme\u002F.kraft\u002Frun\u002Fresults\",\"\u002Fhome\u002Fme\u002Fsrc\u002Fapp\u002F.git\"]",". A harness that does not declare ",[528,1322,1215],{}," gets nothing extra.",[510,1325,1326,1327,1330,1331,1334,1335,1338,1339,1342],{},"Codex binds it to ",[528,1328,1329],{},"-c sandbox_workspace_write.writable_roots={value}",". Its ",[528,1332,1333],{},"workspace-write"," sandbox writes only the workspace and ",[528,1336,1337],{},"\u002Ftmp",", so without the grant a Codex worker on a default install (",[528,1340,1341],{},"~\u002F.kraft",") could write neither its result file nor a commit. Kraft grants both directories outright, because Codex's automatic reviewer is not relied on for either one.",[1277,1344,1246],{"id":1246},[510,1346,1281,1347,1349,1350,1353,1354,1356],{},[528,1348,1246],{}," only for a ",[514,1351,1352],{"href":339},"sandboxed"," launch with ",[528,1355,1254],{},". It is the CLI's MCP servers as one JSON object:",[520,1358,1362],{"className":1359,"code":1360,"language":1361,"meta":526,"style":526},"language-json shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","{\"mcpServers\": {\"kraft\": {\"type\": \"http\", \"url\": \"http:\u002F\u002Fkraft\u002Fmcp\"}}}\n","json",[528,1363,1364],{"__ignoreMap":526},[531,1365,1366,1369,1372,1375,1378,1380,1383,1385,1388,1390,1393,1395,1398],{"class":533,"line":534},[531,1367,1368],{"class":541},"{",[531,1370,1371],{"class":537},"\"mcpServers\"",[531,1373,1374],{"class":541},": {",[531,1376,1377],{"class":537},"\"kraft\"",[531,1379,1374],{"class":541},[531,1381,1382],{"class":537},"\"type\"",[531,1384,542],{"class":541},[531,1386,1387],{"class":545},"\"http\"",[531,1389,601],{"class":541},[531,1391,1392],{"class":537},"\"url\"",[531,1394,542],{"class":541},[531,1396,1397],{"class":545},"\"http:\u002F\u002Fkraft\u002Fmcp\"",[531,1399,1400],{"class":541},"}}}\n",[510,1402,1403,1404,1407,1408,1410],{},"That is Kraft's own server for the session, reached through the sandbox's route out, because the MCP server registered on your machine is out of the container's reach. Claude binds it to ",[528,1405,1406],{},"--strict-mcp-config --mcp-config {value}",", so that server is its only one and its ",[528,1409,1136],{}," tool is answered there.",[716,1412,1414],{"id":1413},"capability-keys","Capability keys",[510,1416,1417],{},"These keys sit under a capability.",[721,1419,1420,1436],{},[724,1421,1422],{},[727,1423,1424,1427,1429,1431,1434],{},[730,1425,1426],{},"Key",[730,1428,735],{},[730,1430,738],{},[730,1432,1433],{},"Applies to",[730,1435,741],{},[743,1437,1438,1462,1496,1528,1551,1573,1593,1614],{},[727,1439,1440,1444,1447,1452,1455],{},[748,1441,1442],{},[528,1443,593],{},[748,1445,1446],{},"list of strings",[748,1448,1449],{},[528,1450,1451],{},"[]",[748,1453,1454],{},"any invocable capability",[748,1456,1457,1458,714],{},"The argv fragment. See ",[514,1459,1461],{"href":1460},"#argv-fragments-and-placeholders","Argv fragments and placeholders",[727,1463,1464,1469,1471,1474,1482],{},[748,1465,1466],{},[528,1467,1468],{},"via",[748,1470,754],{},[748,1472,1473],{},"unset",[748,1475,1476,601,1478,601,1480],{},[528,1477,1152],{},[528,1479,1089],{},[528,1481,1092],{},[748,1483,1484,1485,601,1488,1074,1491,1255,1494,714],{},"Binds the capability to something other than a flag: ",[528,1486,1487],{},"command_resume",[528,1489,1490],{},"permission_hook",[528,1492,1493],{},"permission_rules",[514,1495,1102],{"href":1101},[727,1497,1498,1502,1504,1508,1511],{},[748,1499,1500],{},[528,1501,692],{},[748,1503,1446],{},[748,1505,1506],{},[528,1507,1451],{},[748,1509,1510],{},"any capability with a value",[748,1512,1513,1514,1517,1518,1520,1521,1524,1525,714],{},"A closed vocabulary the CLI itself would reject, as ",[528,1515,1516],{},"re.fullmatch"," patterns. Codex's ",[528,1519,1018],{}," is ",[528,1522,1523],{},"minimal, low, medium, high, xhigh","; Claude's is ",[528,1526,1527],{},"low, medium, high, xhigh, max",[727,1529,1530,1535,1537,1539,1542],{},[748,1531,1532],{},[528,1533,1534],{},"always",[748,1536,786],{},[748,1538,1473],{},[748,1540,1541],{},"any capability",[748,1543,1544,1545,1520,1547,1550],{},"The value Kraft uses when nothing else is supplied. Gemini's ",[528,1546,1048],{},[528,1548,1549],{},"yolo",", since a headless worker has nobody to answer an approval prompt.",[727,1552,1553,1558,1560,1562,1566],{},[748,1554,1555],{},[528,1556,1557],{},"under_allowlist",[748,1559,754],{},[748,1561,1473],{},[748,1563,1564],{},[528,1565,1048],{},[748,1567,1568,1569,1255,1571,714],{},"The mode a launch runs in under ",[528,1570,1092],{},[514,1572,1125],{"href":1124},[727,1574,1575,1579,1581,1583,1587],{},[748,1576,1577],{},[528,1578,619],{},[748,1580,754],{},[748,1582,1473],{},[748,1584,1585],{},[528,1586,870],{},[748,1588,1589,1074,1591,714],{},[528,1590,624],{},[528,1592,954],{},[727,1594,1595,1599,1601,1603,1607],{},[748,1596,1597],{},[528,1598,639],{},[748,1600,754],{},[748,1602,1473],{},[748,1604,1605],{},[528,1606,874],{},[748,1608,1609,1074,1612,714],{},[528,1610,1611],{},"envelope",[528,1613,644],{},[727,1615,1616,1621,1623,1625,1631],{},[748,1617,1618],{},[528,1619,1620],{},"reader",[748,1622,754],{},[748,1624,1473],{},[748,1626,1627,601,1629],{},[528,1628,874],{},[528,1630,1189],{},[748,1632,1633,1634,714],{},"The name of one of Kraft's ",[514,1635,1637],{"href":1636},"#log-readers","log readers",[716,1639,1641],{"id":1640},"optional-top-level-keys","Optional top-level keys",[721,1643,1644,1656],{},[724,1645,1646],{},[727,1647,1648,1650,1652,1654],{},[730,1649,1426],{},[730,1651,735],{},[730,1653,738],{},[730,1655,741],{},[743,1657,1658,1679,1701,1721,1741,1761,1789,1821,1846,1866,1887],{},[727,1659,1660,1664,1666,1670],{},[748,1661,1662],{},[528,1663,1487],{},[748,1665,786],{},[748,1667,1668],{},[528,1669,1451],{},[748,1671,1672,1673,1675,1676,1030],{},"The argv prefix for a resume, when it differs from ",[528,1674,563],{}," (see ",[514,1677,1678],{"href":1101},"below",[727,1680,1681,1685,1687,1689],{},[748,1682,1683],{},[528,1684,1490],{},[748,1686,754],{},[748,1688,1473],{},[748,1690,1691,1692,1074,1695,1697,1698,714],{},"The translator (",[528,1693,1694],{},"cursor",[528,1696,961],{},") for a capability bound ",[528,1699,1700],{},"via: permission_hook",[727,1702,1703,1708,1710,1715],{},[748,1704,1705],{},[528,1706,1707],{},"tool_names",[748,1709,804],{},[748,1711,1712],{},[528,1713,1714],{},"{}",[748,1716,1717,1718,1030],{},"Maps the CLI's tool names to Kraft's (",[528,1719,1720],{},"Shell: Bash",[727,1722,1723,1728,1730,1734],{},[748,1724,1725],{},[528,1726,1727],{},"unhooked_tools",[748,1729,1446],{},[748,1731,1732],{},[528,1733,1451],{},[748,1735,1736,1737,1740],{},"Kraft tool names that never reach the hook (",[528,1738,1739],{},"[WebFetch, WebSearch]","). A launch whose policy would have to deny one is refused.",[727,1742,1743,1747,1749,1751],{},[748,1744,1745],{},[528,1746,1493],{},[748,1748,754],{},[748,1750,1473],{},[748,1752,1753,1754,1074,1756,1697,1758,714],{},"The renderer (",[528,1755,1206],{},[528,1757,1011],{},[528,1759,1760],{},"via: permission_rules",[727,1762,1763,1768,1777,1779],{},[748,1764,1765],{},[528,1766,1767],{},"config_dir",[748,1769,1770,1771,871,1774],{},"mapping of ",[528,1772,1773],{},"env",[528,1775,1776],{},"files",[748,1778,1473],{},[748,1780,1781,1782,1785,1786,1030],{},"The CLI's config-directory variable (",[528,1783,1784],{},"env:",") and the JSON files Kraft writes into that directory before each launch (",[528,1787,1788],{},"files:",[727,1790,1791,1796,1798,1802],{},[748,1792,1793],{},[528,1794,1795],{},"network.requires",[748,1797,1446],{},[748,1799,1800],{},[528,1801,1451],{},[748,1803,1804,1805,1808,1809,1812,1813,1816,1817,1820],{},"The hosts the CLI itself reaches (",[528,1806,1807],{},"[api.anthropic.com]","). Kraft adds them to the ",[528,1810,1811],{},"runtime"," allow list of a sandbox with a ",[514,1814,1815],{"href":353},"network policy",", but not to a ",[514,1818,1819],{"href":361},"Kit",", which lists its own. Checked as network-policy hosts when the file loads.",[727,1822,1823,1828,1831,1836],{},[748,1824,1825],{},[528,1826,1827],{},"proxy_aware",[748,1829,1830],{},"boolean",[748,1832,1833],{},[528,1834,1835],{},"true",[748,1837,1838,1841,1842,1845],{},[528,1839,1840],{},"false"," for a CLI that ignores ",[528,1843,1844],{},"HTTP(S)_PROXY",". Under a network policy its only route is Kraft's proxy, so Kraft refuses such a harness before launch.",[727,1847,1848,1853,1856,1860],{},[748,1849,1850],{},[528,1851,1852],{},"credentials",[748,1854,1855],{},"list of mappings",[748,1857,1858],{},[528,1859,1451],{},[748,1861,1862,1863,714],{},"How Kraft's egress proxy can hold each credential the CLI reads. See ",[514,1864,1852],{"href":1865},"#credentials",[727,1867,1868,1873,1875,1877],{},[748,1869,1870],{},[528,1871,1872],{},"min_version",[748,1874,754],{},[748,1876,1473],{},[748,1878,1879,1880,1883,1884,714],{},"The oldest release (",[528,1881,1882],{},"N.N.N",") of the CLI this file's argv works with. See ",[514,1885,1872],{"href":1886},"#min_version",[727,1888,1889,1894,1896,1898],{},[748,1890,1891],{},[528,1892,1893],{},"container_permission_mode",[748,1895,754],{},[748,1897,1473],{},[748,1899,1900,1901,1903,1904,1907,1908,1911,1912,542,1914,1917,1918,1920,1921,1924],{},"The ",[528,1902,1048],{}," a launch gets under Kraft's ",[514,1905,1906],{"href":339},"docker sandbox",", unless it chose a mode other than the capability's ",[528,1909,1910],{},"always:",". For a CLI whose own sandbox cannot start in a container (",[528,1913,961],{},[528,1915,1916],{},"danger-full-access","). Checked against ",[528,1919,1048],{},"'s ",[528,1922,1923],{},"values:"," at load.",[1277,1926,1852],{"id":1852},[510,1928,1929,1930,601,1932,871,1934,1936],{},"The shipped ",[528,1931,958],{},[528,1933,961],{},[528,1935,1107],{}," files declare credentials:",[721,1938,1939,1955],{},[724,1940,1941],{},[727,1942,1943,1946,1949,1952],{},[730,1944,1945],{},"Harness",[730,1947,1948],{},"Variable",[730,1950,1951],{},"Header",[730,1953,1954],{},"Host",[743,1956,1957,1977,1995,2014],{},[727,1958,1959,1962,1967,1972],{},[748,1960,1961],{},"Claude",[748,1963,1964],{},[528,1965,1966],{},"ANTHROPIC_API_KEY",[748,1968,1969],{},[528,1970,1971],{},"x-api-key",[748,1973,1974],{},[528,1975,1976],{},"api.anthropic.com",[727,1978,1979,1981,1986,1991],{},[748,1980,1961],{},[748,1982,1983],{},[528,1984,1985],{},"CLAUDE_CODE_OAUTH_TOKEN",[748,1987,1988],{},[528,1989,1990],{},"Authorization: Bearer",[748,1992,1993],{},[528,1994,1976],{},[727,1996,1997,2000,2005,2009],{},[748,1998,1999],{},"Codex",[748,2001,2002],{},[528,2003,2004],{},"CODEX_API_KEY",[748,2006,2007],{},[528,2008,1990],{},[748,2010,2011],{},[528,2012,2013],{},"api.openai.com",[727,2015,2016,2019,2024,2029],{},[748,2017,2018],{},"Gemini",[748,2020,2021],{},[528,2022,2023],{},"GEMINI_API_KEY",[748,2025,2026],{},[528,2027,2028],{},"x-goog-api-key",[748,2030,2031],{},[528,2032,2033],{},"generativelanguage.googleapis.com",[510,2035,2036,2037,2039,2040,2043,2044,2047,2048,601,2050,871,2052,2054,2055,2057],{},"Codex's variable is ",[528,2038,2004],{}," because ",[528,2041,2042],{},"codex exec"," does not send an ",[528,2045,2046],{},"OPENAI_API_KEY",". The ",[528,2049,1966],{},[528,2051,2004],{},[528,2053,2023],{}," pairings work in a Docker and a Podman sandbox. Kraft has not confirmed the ",[528,2056,1985],{}," pairing.",[510,2059,2060],{},"Each credential declares:",[1286,2062,2063,2067,2072,2078],{},[1289,2064,2065],{},[528,2066,1773],{},[1289,2068,2069],{},[528,2070,2071],{},"service",[1289,2073,2074,2077],{},[528,2075,2076],{},"sentinel",": the value the container sees instead (shaped like a real key where the CLI may check).",[1289,2079,2080,2083,2084,601,2087,2090,2091,1295,2094,1030],{},[528,2081,2082],{},"inject",": a list of ",[528,2085,2086],{},"domain",[528,2088,2089],{},"header"," and optional ",[528,2092,2093],{},"format",[528,2095,2096],{},"Bearer %s",[510,2098,2099],{},"The rules:",[1286,2101,2102,2110,2118],{},[1289,2103,2104,2105,2107,2108,714],{},"Each ",[528,2106,2086],{}," must be one of ",[528,2109,1795],{},[1289,2111,2112,871,2115,2117],{},[528,2113,2114],{},"phase",[528,2116,639],{}," are a repository's to set, and refused here.",[1289,2119,2120,2121,714],{},"Kraft uses a declaration only for a variable a repository lists under ",[514,2122,2123],{"href":357},[528,2124,2125],{},"sandbox.credentials",[1277,2127,1872],{"id":1872},[510,2129,2130,2131,2134],{},"Each launch runs ",[528,2132,2133],{},"\u003Ccommand> --version"," (in the image, when sandboxed) and refuses an older one by name. An answer with no version in it lets the launch go ahead.",[510,2136,1929,2137,2139,2140,2143,2144,2147,2148,871,2151,2154,2155,714],{},[528,2138,1206],{}," needs ",[528,2141,2142],{},"2.0.0",": npm's ",[528,2145,2146],{},"opencode-ai"," 1.x refuses ",[528,2149,2150],{},"--standalone",[528,2152,2153],{},"--log-level error",", so install 2.x from opencode.ai or Homebrew's ",[528,2156,2157],{},"anomalyco\u002Ftap\u002Fopencode-v2",[1277,2159,2161],{"id":2160},"log-readers","Log readers",[510,2163,1900,2164,2166,2167,1074,2169,2171,2172,601,2175,601,2178,601,2181,601,2184,1074,2187,2190,2191,714],{},[528,2165,859],{}," in a ",[528,2168,874],{},[528,2170,1189],{}," capability names one of Kraft's log readers: ",[528,2173,2174],{},"claude-stream-json",[528,2176,2177],{},"codex-json",[528,2179,2180],{},"cursor-stream-json",[528,2182,2183],{},"opencode-json",[528,2185,2186],{},"amp-stream-json",[528,2188,2189],{},"antigravity-stream-json",". A reader reads the log, so the file must also declare ",[528,2192,982],{},[716,2194,1461],{"id":2195},"argv-fragments-and-placeholders",[510,2197,2198,2199,2201,2202,1074,2204,2206,2207,2209,2210,2212,2213,871,2215,2218,2219,2221,2222,2224],{},"A capability needs a ",[528,2200,811],{}," argv fragment unless it is ",[528,2203,874],{},[528,2205,1189],{},", or it is ",[528,2208,870],{}," with ",[528,2211,828],{},", which Kraft folds into the prompt text. ",[528,2214,1315],{},[528,2216,2217],{},"{csv}"," are the whole placeholder language: ",[528,2220,1315],{}," is one substituted string and ",[528,2223,2217],{}," a comma-joined list.",[510,2226,2227,2228,2230],{},"Kraft builds the command line in the order the capabilities are declared. A capability whose fragment is a bare ",[528,2229,1315],{}," (a positional argument) must be declared last.",[716,2232,1102],{"id":2233},"constraints-and-alternate-bindings",[1286,2235,2236,2244,2252,2271,2295],{},[1289,2237,2238,2240,2241,2243],{},[528,2239,1923],{}," is a list of ",[528,2242,1516],{}," patterns. A value outside them fails at load, not at launch.",[1289,2245,2246,2248,2249,2251],{},[528,2247,1910],{}," is the value Kraft uses when a binding supplies none. For a list capability, Kraft merges it with what a binding supplies. Kraft checks it against ",[528,2250,1923],{}," too.",[1289,2253,2254,2256,2257,2260,2261,2263,2264,2267,2268,714],{},[528,2255,1152],{}," can bind ",[528,2258,2259],{},"via: command_resume"," instead of ",[528,2262,811],{},", when a resume needs its own command prefix. ",[528,2265,2266],{},"codex.yaml"," uses ",[528,2269,2270],{},"command_resume: [codex, exec, resume, \"{value}\"]",[1289,2272,2273,871,2275,2256,2277,2279,2280,2283,2284,1074,2286,2288,2289,2292,2293,1030],{},[528,2274,1089],{},[528,2276,1092],{},[528,2278,1700],{},": no flag, and Kraft's pre-tool hook enforces the lists. This needs a top-level ",[528,2281,2282],{},"permission_hook:"," naming the translator (",[528,2285,1694],{},[528,2287,961],{},"), and ",[528,2290,2291],{},"tool_names:"," mapping the CLI's tool names to Kraft's (",[528,2294,1720],{},[1289,2296,2297,2298,2300,2301,2304,2305,1074,2307,2309],{},"The same two capabilities can bind ",[528,2299,1760],{},", for a CLI with no hook. A top-level ",[528,2302,2303],{},"permission_rules:"," names the renderer (",[528,2306,1206],{},[528,2308,1011],{},") that writes the tool lists into the CLI's own permission config at launch. A policy name that no CLI tool maps to refuses the launch.",[716,2311,1125],{"id":2312},"allowlists",[510,2314,2315,2316,2318],{},"A launch whose policy sets ",[528,2317,1092],{}," (an empty list included) must not let a tool outside the list run. A harness meets that in one of three ways:",[1286,2320,2321,2345,2351],{},[1289,2322,2323,2324,2326,2327,2330,2331,2333,2334,2337,2338,2341,2342,2344],{},"It declares ",[528,2325,1116],{}," (the CLI's own flag for which built-in tools exist, such as Claude's ",[528,2328,2329],{},"--tools",") and a ",[528,2332,1048],{}," with an ",[528,2335,2336],{},"under_allowlist:"," mode that asks the approval channel about everything else (Claude's ",[528,2339,2340],{},"manual","). A harness missing either refuses to launch under an allowlist, and so does a launch whose own ",[528,2343,1048],{}," differs from that mode.",[1289,2346,2347,2348,2350],{},"It has a ",[528,2349,1490],{},", which denies every tool the list does not name, fail-closed.",[1289,2352,2353,2354,2356],{},"It has ",[528,2355,1493],{},", which deny every tool the list does not name.",[716,2358,2360],{"id":2359},"checking-harness-files","Checking harness files",[510,2362,2363,2366,2367,2370],{},[528,2364,2365],{},"kraft admin doctor"," runs one ",[528,2368,2369],{},"PATH"," check per harness profile that the live library's chains select, not every declared one. It adds a failure row for any harness file that failed to load.",[716,2372,2374],{"id":2373},"related","Related",[1286,2376,2377,2382,2387],{},[1289,2378,2379,2381],{},[514,2380,394],{"href":395},": the seven shipped harnesses side by side.",[1289,2383,2384,2386],{},[514,2385,123],{"href":124},": write a file step by step.",[1289,2388,2389,2393,2394,2396],{},[514,2390,2391],{"href":319},[528,2392,318],{},": the harness profiles in ",[528,2395,318],{}," that select a harness.",[2398,2399,2400],"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 .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":526,"searchDepth":549,"depth":549,"links":2402},[2403,2404,2410,2411,2418,2419,2420,2421,2422],{"id":718,"depth":549,"text":719},{"id":578,"depth":549,"text":862,"children":2405},[2406,2408],{"id":1215,"depth":560,"text":2407},"writable_​dirs",{"id":1246,"depth":560,"text":2409},"mcp_​config",{"id":1413,"depth":549,"text":1414},{"id":1640,"depth":549,"text":2412,"children":2413},"Optional top-​level keys",[2414,2415,2417],{"id":1852,"depth":560,"text":1852},{"id":1872,"depth":560,"text":2416},"min_​version",{"id":2160,"depth":560,"text":2161},{"id":2195,"depth":549,"text":1461},{"id":2233,"depth":549,"text":1102},{"id":2312,"depth":549,"text":1125},{"id":2359,"depth":549,"text":2360},{"id":2373,"depth":549,"text":2374},"The YAML file that describes one harness: the capabilities it declares, argv fragments, constraints, and allowlists.","md",null,{},true,{"title":408,"description":2423},"-KDnUjawcX1Dr-m0K7pByX5ShQpyWXIH2eluf92cBbE",[2431,2433],{"title":404,"path":405,"stem":406,"description":2432,"children":-1},"Named model tiers a task selects with profile: instead of model and effort.",{"title":412,"path":413,"stem":414,"description":2434,"children":-1},"Where a launch goes next when a harness is limited or unavailable, and which harness runs an escalation turn.",1791801258853]