[{"data":1,"prerenderedAt":1844},["ShallowReactive",2],{"navigation_docs":3,"-reference-configuration-repos-connect-proposals":504,"-reference-configuration-repos-connect-proposals-surround":1839},[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":298,"body":506,"description":1832,"extension":1833,"links":1834,"meta":1835,"navigation":1836,"path":299,"seo":1837,"stem":300,"__hash__":1838},"docs\u002F5.reference\u002F03.configuration\u002F02.repos\u002F1.connect-proposals.md",{"type":507,"value":508,"toc":1810},"minimark",[509,529,544,557,561,581,612,622,625,651,675,678,683,695,702,705,774,778,786,805,808,815,823,827,830,971,981,985,988,1113,1117,1120,1186,1215,1219,1246,1250,1258,1307,1311,1337,1347,1362,1380,1384,1406,1458,1461,1479,1482,1498,1502,1508,1530,1534,1544,1587,1600,1603,1637,1648,1657,1671,1683,1687,1690,1778,1782],[510,511,512,516,517,520,521,524,525,528],"p",{},[513,514,515],"code",{},"kraft repo connect"," proposes a ",[513,518,519],{},"setup_command"," and a ",[513,522,523],{},"test_command"," (and ",[513,526,527],{},"test_scopes"," for a repo with more than one project in it) by reading the repo's own files. It prints each command with the file it came from and lists what else it found.",[510,530,531,532,537,538,540,541,543],{},"The result is a proposal for you to check. Nothing at run time guesses: a ",[533,534,536],"a",{"href":535},"\u002Fconcepts\u002Fvocabulary#work-item","work item"," runs only what ",[513,539,292],{}," declares. To teach connect your own conventions, see ",[533,542,302],{"href":303},".",[510,545,546,547,551,552,556],{},"If connect proposed nothing or the wrong thing, start with ",[533,548,550],{"href":549},"#when-connect-finds-no-command","When connect finds no command"," and ",[533,553,555],{"href":554},"#choosing-something-else","Choosing something else",". The sections after them say how a proposal is made.",[558,559,550],"h2",{"id":560},"when-connect-finds-no-command",[510,562,563,564,566,567,573,574,577,578,580],{},"Connect says when it found no command. With no ",[513,565,523],{}," it saves the repo disabled (see ",[533,568,570],{"href":569},"\u002Freference\u002Fconfiguration\u002Frepos#enabled",[513,571,572],{},"enabled","). ",[513,575,576],{},"kraft admin doctor"," reports any connected repo still missing a ",[513,579,519],{},". Either:",[582,583,584,606],"ul",{},[585,586,587,588,590,591,594,595,599,600,602,603,543],"li",{},"Set ",[513,589,519],{}," yourself, or ",[513,592,593],{},"\"\""," (the ",[596,597,598],"strong",{},"No setup needed"," checkbox in Settings › Repos) if the repo needs no preparation, and set ",[513,601,523],{},", then ",[513,604,605],{},"enabled: true",[585,607,608,609,611],{},"Or fix the cause, such as committing the missing lockfile, and run ",[513,610,515],{}," again: on a connected repo it fills in only what the entry left undecided, and enables a repo that was disabled for want of a test command.",[510,613,614,615,618,619,621],{},"A repo that has no tests at all is the third case: connect it with ",[513,616,617],{},"--no-tests"," (see ",[533,620,555],{"href":554},"). A setup it found still has to be confirmed or replaced.",[558,623,555],{"id":624},"choosing-something-else",[510,626,627,628,634,635,638,639,638,642,638,644,551,647,650],{},"The proposal is a starting point. The ",[533,629,631,633],{"href":630},"\u002Freference\u002Fcli\u002Frepo#connect-a-repo",[513,632,515],{}," flags"," (",[513,636,637],{},"--test-command",", ",[513,640,641],{},"--setup-command",[513,643,617],{},[513,645,646],{},"--verify",[513,648,649],{},"--timeout",") replace or check it. What they do to a proposal, beyond what that page says:",[582,652,653,658,669],{},[585,654,655,657],{},[513,656,637],{}," replaces the root's test command. Nested scopes are still probed.",[585,659,660,662,663,665,666,668],{},[513,661,641],{}," is the repo's whole ",[513,664,519],{},", nested directories included, since that is the one field ",[513,667,292],{}," has.",[585,670,671,672,674],{},"With ",[513,673,617],{},", verify passes, saying so. Nested and area scopes still run, and a change outside them selects every scope, as it always does.",[510,676,677],{},"In a terminal, connect lists the root's candidates and asks which to use.",[679,680,682],"h3",{"id":681},"verify-a-proposal","Verify a proposal",[510,684,685,690,691,694],{},[533,686,688],{"href":687},"\u002Freference\u002Fcli\u002Frepo#verify-a-repos-commands",[513,689,646],{}," fails when a command leaves files every work item would commit, such as a lockfile an unlocked install writes, or an unignored ",[513,692,693],{},"build\u002F",". It also fails when a command does not finish in time, usually a test runner in watch mode.",[510,696,697,698,701],{},"Each test runs with the environment a work item gives it, so the ",[513,699,700],{},"__pycache__\u002F"," a Python test would otherwise write is not reported.",[510,703,704],{},"What verify does with files a command writes:",[582,706,707,723,741,757],{},[585,708,709,715,716,719,720,543],{},[596,710,711,712],{},"A virtualenv or ",[513,713,714],{},"node_modules"," a setup installs does not fail verify, since Kraft's own commits leave it out. If the repo does not ignore it, verify still names it: the agent commits on its own too, and its ",[513,717,718],{},"git add -A"," would take it. Add it to ",[513,721,722],{},".gitignore",[585,724,725,732,733,736,737,740],{},[596,726,727,728,731],{},"A ",[513,729,730],{},"uv.lock"," the setup command writes",", as ",[513,734,735],{},"uv sync"," does in a repo that commits none, does not fail verify either (an entry connected before 2.0 can still run it). Kraft's commits leave that file out, the item's events name it (",[513,738,739],{},"sweep_left_out","), and verify names it too.",[585,742,743,748,749,752,753,756],{},[596,744,727,745,747],{},[513,746,730],{}," the agent writes"," is its work and is committed, and so is an edit the agent makes to the setup's. One a test command writes (",[513,750,751],{},"uv run",") is committed as well, so verify fails on it. Commit one (",[513,754,755],{},"uv lock",") so every work item installs the same versions.",[585,758,759,769,770,773],{},[596,760,727,761,764,765,768],{},[513,762,763],{},"Cargo.lock"," that ",[513,766,767],{},"cargo fetch"," writes"," in a crate that commits none is treated the same way, with ",[513,771,772],{},"cargo generate-lockfile"," as the advice.",[558,775,777],{"id":776},"what-is-read","What is read",[510,779,780,781,785],{},"The probe reads the commit a work item's ",[533,782,784],{"href":783},"\u002Fconcepts\u002Fvocabulary#worktree","worktree"," is cut from, not your working copy:",[582,787,788,799],{},[585,789,790,791,794,795,798],{},"origin's default branch when the clone has it (",[513,792,793],{},"origin\u002FHEAD",", else ",[513,796,797],{},"origin\u002Fmain",")",[585,800,801,802],{},"otherwise the checkout's ",[513,803,804],{},"HEAD",[510,806,807],{},"An untracked file, an uncommitted edit, or a commit you have not pushed yet changes nothing. Connect says which commit it read.",[510,809,810,811,814],{},"A repo with no commit yet is refused: a work item's branch starts from a commit, so the proposal would be read from files the branch does not have. Commit its files, then connect it. (The probe alone, ",[513,812,813],{},"POST \u002Frepos\u002Fprobe",", which only inspects, reads such a repo from its working copy: its own regular files, nothing gitignored, no symlinks.)",[510,816,817,818,551,820,822],{},"A file is read up to 4 MB, and a Git LFS file reads as its pointer. A repo that git cannot list within two minutes fails the probe rather than reading as empty; connect it with ",[513,819,637],{},[513,821,641],{}," instead. If you give both, a repo the probe cannot read still connects with them, and connect says why the probe failed.",[558,824,826],{"id":825},"where-a-proposal-comes-from","Where a proposal comes from",[510,828,829],{},"Evidence is ranked. The first kind found wins, and everything else it found is listed as an alternative:",[831,832,833,849],"table",{},[834,835,836],"thead",{},[837,838,839,843,846],"tr",{},[840,841,842],"th",{},"Rank",[840,844,845],{},"Evidence",[840,847,848],{},"Examples",[850,851,852,915,946],"tbody",{},[837,853,854,858,885],{},[855,856,857],"td",{},"1",[855,859,860,863,864,867,868,638,871,874,875,867,878,638,881,884],{},[596,861,862],{},"A task runner the repo wrote."," A ",[513,865,866],{},"test"," (or ",[513,869,870],{},"tests",[513,872,873],{},"check",") task, and a ",[513,876,877],{},"setup",[513,879,880],{},"bootstrap",[513,882,883],{},"deps",") task.",[855,886,887,890,891,894,895,898,899,902,903,551,906,638,909,551,912],{},[513,888,889],{},"justfile"," recipes, ",[513,892,893],{},"Makefile"," targets, ",[513,896,897],{},"Taskfile.yml"," tasks, ",[513,900,901],{},"mise.toml"," tasks, executable ",[513,904,905],{},"script\u002Ftest",[513,907,908],{},"script\u002Fbootstrap",[513,910,911],{},"bin\u002Ftest",[513,913,914],{},"bin\u002Fsetup",[837,916,917,920,925],{},[855,918,919],{},"2",[855,921,922],{},[596,923,924],{},"A toolchain's default, picked by its lockfile.",[855,926,927,930,931,638,934,930,937,638,940,930,943],{},[513,928,929],{},"pnpm-lock.yaml"," gives ",[513,932,933],{},"pnpm",[513,935,936],{},"poetry.lock",[513,938,939],{},"poetry",[513,941,942],{},"gradlew",[513,944,945],{},".\u002Fgradlew",[837,947,948,951,957],{},[855,949,950],{},"3",[855,952,953,956],{},[596,954,955],{},"What CI runs."," Test commands only, and only where neither of the above has one.",[855,958,959,962,963,966,967,970],{},[513,960,961],{},".github\u002Fworkflows\u002F*.yml"," (with each step's ",[513,964,965],{},"working-directory","), ",[513,968,969],{},".gitlab-ci.yml",", CircleCI, Azure Pipelines, Bitbucket, Buildkite, Drone, Woodpecker, Travis",[510,972,973,974,977,978,980],{},"CI ranks last because a CI job is often one slice of the suite: one matrix entry, one module, a type check named ",[513,975,976],{},"typecheck:tests",". The repo's own ",[513,979,866],{}," task or toolchain default runs all of it.",[679,982,984],{"id":983},"ci-rules","CI rules",[510,986,987],{},"Within CI:",[582,989,990,993,1007,1010,1021,1077,1095],{},[585,991,992],{},"A command that a runner or toolchain also proposes is shown with \"CI runs it too\". Between two candidates of the same rank, the one CI runs wins.",[585,994,995,996,638,999,1002,1003,1006],{},"A line that runs a bare tool (",[513,997,998],{},"pytest -x",[513,1000,1001],{},"jest",") ranks below every other candidate. CI installed that tool on its own ",[513,1004,1005],{},"PATH",", which a worktree does not have.",[585,1008,1009],{},"The repo's test workflows are read before its e2e, Playwright, Cypress, nightly, release, deploy and docs ones.",[585,1011,1012,1013,1016,1017,1020],{},"A line that only means something inside its script is dropped. That covers a variable, a pipe or redirect, a ",[513,1014,1015],{},"case"," arm, ",[513,1018,1019],{},"echo",", an OS package install, or a global tool install.",[585,1022,1023,1024,638,1027,638,1029,638,1032,638,1035,638,1038,638,1041,638,1044,1047,1048,638,1051,638,1054,1057,1058,638,1061,638,1064,638,1067,638,1070,638,1073,1076],{},"A tool that also runs other things (",[513,1025,1026],{},"npm",[513,1028,933],{},[513,1030,1031],{},"yarn",[513,1033,1034],{},"bun",[513,1036,1037],{},"deno",[513,1039,1040],{},"cargo",[513,1042,1043],{},"go",[513,1045,1046],{},"dotnet",") counts only on its test verb (",[513,1049,1050],{},"npm test",[513,1052,1053],{},"npm run test:unit",[513,1055,1056],{},"go test","). No runner counts when the line has it run something else (",[513,1059,1060],{},"exec",[513,1062,1063],{},"dlx",[513,1065,1066],{},"--call",[513,1068,1069],{},"--shell-mode",[513,1071,1072],{},"--config",[513,1074,1075],{},"-exec",").",[585,1078,1079,1081,1082,1084,1085,1088,1089,638,1092,1076],{},[513,1080,866],{}," as part of a task name (",[513,1083,976],{},") or after Gradle's ",[513,1086,1087],{},"-x",", which excludes the tests, does not make a line a test command. Nor does it in a tool's own install (",[513,1090,1091],{},"mix deps.get --only test",[513,1093,1094],{},"uv sync --group tests",[585,1096,1097,1098,1100,1101,1107,1108,1110,1111,543],{},"A step's ",[513,1099,965],{}," is held to the same rules as any other directory: by default at most two levels down (",[533,1102,1104],{"href":1103},"\u002Freference\u002Fconfiguration\u002Frepos\u002Fdetectors#top-level-keys",[513,1105,1106],{},"max_depth"," in ",[513,1109,302],{}," changes it), and under no non-project name such as ",[513,1112,866],{},[679,1114,1116],{"id":1115},"a-ci-line-that-hands-a-script-to-a-shell","A CI line that hands a script to a shell",[510,1118,1119],{},"Connect lists such a line with the CI candidates, marked as a script, and never chooses it. What runs is in the quoted text, which Kraft does not read. A line is one of these when it is:",[582,1121,1122,1135,1155],{},[585,1123,1124,1125,1128,1129,638,1132],{},"a shell or interpreter run with ",[513,1126,1127],{},"-c",": ",[513,1130,1131],{},"bash -c \"…\"",[513,1133,1134],{},"python -c \"…\"",[585,1136,1137,1138,638,1141,638,1144,638,1147,1150,1151,1154],{},"an interpreter given a script by its own script flag, whatever the script holds: ",[513,1139,1140],{},"perl -e '…'",[513,1142,1143],{},"ruby -I lib -e '…'",[513,1145,1146],{},"node -e '…'",[513,1148,1149],{},"php -r '…'",". ",[513,1152,1153],{},"python -E -m pytest"," is not one.",[585,1156,1157,1158,638,1161,638,1164,638,1167,638,1170,1173,1174,638,1177,638,1180,638,1183],{},"any line whose quoted text holds shell syntax (",[513,1159,1160],{},"|",[513,1162,1163],{},";",[513,1165,1166],{},"&",[513,1168,1169],{},"\u003C",[513,1171,1172],{},">",", parentheses or braces): ",[513,1175,1176],{},"env -S '…'",[513,1178,1179],{},"nix-shell --run \"…\"",[513,1181,1182],{},"pwsh -Command \"…\"",[513,1184,1185],{},"awk 'BEGIN { system(…) }'",[510,1187,1188,1189,638,1192,638,1195,1198,1199,638,1201,638,1204,638,1207,1210,1211,1214],{},"The exception is a known test runner reading that text as its own argument, run with no shell: ",[513,1190,1191],{},"pytest -k \"not (a or b)\"",[513,1193,1194],{},"go test -run 'Test(Foo|Bar)'",[513,1196,1197],{},"jest --testPathPattern \"(unit|int)\"",". It stays a candidate, also behind ",[513,1200,751],{},[513,1202,1203],{},"poetry run",[513,1205,1206],{},"python -m",[513,1208,1209],{},"npx"," or ",[513,1212,1213],{},"xvfb-run"," and their options.",[679,1216,1218],{"id":1217},"evidence-that-is-listed-and-never-chosen","Evidence that is listed and never chosen",[582,1220,1221,1227,1240],{},[585,1222,1223,1226],{},[596,1224,1225],{},"CI setup lines."," CI installs global tools a worktree must not.",[585,1228,1229,1232,1233,638,1236,1239],{},[596,1230,1231],{},"A dev container's create commands."," They are written for a container, and often install into its global interpreter. One that provisions the container itself (",[513,1234,1235],{},"sudo",[513,1237,1238],{},"apt-get",") is not listed at all.",[585,1241,1242,1245],{},[596,1243,1244],{},"A CI line that hands a script to a shell."," See the section above.",[679,1247,1249],{"id":1248},"evidence-a-toolchain-needs","Evidence a toolchain needs",[510,1251,1252,1253,1257],{},"A toolchain (the ",[533,1254,1256],{"href":1255},"\u002Freference\u002Fconfiguration\u002Frepos\u002Fdetectors#toolchains-in-the-shipped-table","shipped table"," lists them) needs evidence for its test command, as well as its marker file:",[582,1259,1260,1273,1291,1297],{},[585,1261,727,1262,1265,1266,1268,1269,1272],{},[513,1263,1264],{},"package.json"," counts only with a real ",[513,1267,866],{}," script. npm's ",[513,1270,1271],{},"\"no test specified\""," placeholder does not count.",[585,1274,1275,1276,1279,1280,1279,1283,1286,1287,1290],{},"pytest is proposed only when something names it: ",[513,1277,1278],{},"pytest.ini",", a ",[513,1281,1282],{},"conftest.py",[513,1284,1285],{},"[tool.pytest]"," table, a dependency, or a lockfile entry. A plugin like ",[513,1288,1289],{},"flake8-pytest-style"," does not count.",[585,1292,727,1293,1296],{},[513,1294,1295],{},"pyproject.toml"," holding only tool settings (ruff, black) does not make a repo a Python project.",[585,1298,1299,1302,1303,1306],{},[513,1300,1301],{},"go test .\u002F..."," is proposed only when a ",[513,1304,1305],{},"_test.go"," file is there or below. With none, it compiles every package and passes with \"no test files\", which tests nothing.",[679,1308,1310],{"id":1309},"how-a-command-is-run","How a command is run",[510,1312,1313,1314,1316,1317,638,1320,1210,1323,1326,1327,638,1330,1333,1334,1336],{},"A task runner's ",[513,1315,866],{}," task that runs ",[513,1318,1319],{},"pytest",[513,1321,1322],{},"python",[513,1324,1325],{},"coverage"," bare, in a directory a Python lockfile locks, is run through that lockfile's tool: ",[513,1328,1329],{},"uv run .\u002Fscripts\u002Ftest.sh",[513,1331,1332],{},"poetry run make test",". Bare, it would run whatever Python a worker's ",[513,1335,1005],{}," has, without the project's dependencies.",[510,1338,1339,1340,1343,1344,1346],{},"A toolchain's install takes the flags CI gives the same command in the same directory: a CI step ",[513,1341,1342],{},"uv sync --extra all --group tests"," makes the proposal that, not ",[513,1345,735],{},". Only options and their values are taken.",[510,1348,1349,1350,1353,1354,1357,1358,1361],{},"When toolchains of more than one family have a test in one directory (tauri's pnpm and Cargo, phoenix's npm and mix), its test command runs each of them, in the ",[533,1351,1352],{"href":1255},"shipped table's"," order (Python first): ",[513,1355,1356],{},"sh -c 'pnpm test && cargo test --workspace'",". One family's tests passing says nothing of the other's. Its setup is then each of those toolchains' installs. A task runner's test command (",[513,1359,1360],{},"make test",") gets every toolchain's install, since which ones it needs is not known.",[510,1363,1364,1365,1368,1369,1372,1373,1379],{},"A toolchain whose setup makes a virtualenv (a ",[513,1366,1367],{},"requirements.txt"," project's ",[513,1370,1371],{},".venv",") has a task runner's or CI's test command there run inside it. ",[533,1374,1376],{"href":1375},"\u002Freference\u002Fconfiguration\u002Frepos\u002Fdetectors#detector-fields",[513,1377,1378],{},"venv"," says how.",[679,1381,1383],{"id":1382},"a-python-project-with-no-lockfile","A Python project with no lockfile",[510,1385,1386,1387,1389,1390,638,1392,638,1394,1397,1398,551,1400,1402,1403,1405],{},"One project gets no proposal at all: a ",[513,1388,1295],{}," declaring a project with no lockfile beside it (",[513,1391,730],{},[513,1393,936],{},[513,1395,1396],{},"pdm.lock",", a Pipfile). ",[513,1399,735],{},[513,1401,751],{}," would each write a ",[513,1404,730],{}," into every work item's worktree, for the worker to commit.",[582,1407,1408,1417,1431,1434],{},[585,1409,1410,1411,1210,1414,1416],{},"Its directory proposes no test and no setup. Kraft does not fall back to a ",[513,1412,1413],{},"go.mod",[513,1415,1264],{}," beside it either.",[585,1418,1419,1420,1423,1424,1427,1428,1430],{},"Two things still stand there: a lockfile install (",[513,1421,1422],{},"npm ci"," beside a ",[513,1425,1426],{},"package-lock.json",") and a task runner's own ",[513,1429,866],{}," task, which comes first.",[585,1432,1433],{},"At the root, it means no test command for the whole repo.",[585,1435,1436,1437,1440,1441,1444,1445,1447,1448,1450,1451,1454,1455,1457],{},"Below the root, the directory gets no test command either. A change there would otherwise pass on the other scopes' tests: say ",[513,1438,1439],{},"backend\u002F"," has such a project and ",[513,1442,1443],{},"frontend\u002F"," has a ",[513,1446,1264],{},". A change to ",[513,1449,1439],{}," matches no scope, and a change that matches none runs every scope, so a ",[513,1452,1453],{},"frontend\u002F**"," scope alone would pass it on ",[513,1456,1050],{}," with the Python tests never run.",[510,1459,1460],{},"The exception is a root command that already runs those tests:",[582,1462,1463,1468,1474],{},[585,1464,1465,1466],{},"a command you give with ",[513,1467,637],{},[585,1469,1470,1471,1473],{},"the root task runner's ",[513,1472,866],{}," recipe",[585,1475,1476,1477,798],{},"a lockfile install of the same kind at the root (a uv workspace's ",[513,1478,730],{},[510,1480,1481],{},"The directory then gets no scope of its own, and the root scope covers it.",[510,1483,1484,1485,638,1488,1491,1492,1494,1495,1497],{},"Connect says which directory stopped the proposal, and what to do: a Poetry or PDM project is told to commit its own lock (",[513,1486,1487],{},"poetry lock",[513,1489,1490],{},"pdm lock","), and any other to set its test command, or commit a ",[513,1493,730],{},". Once the lockfile is committed, run ",[513,1496,515],{}," again: it fills in what the first connect left undecided.",[558,1499,1501],{"id":1500},"proposals-that-need-something-from-you","Proposals that need something from you",[510,1503,1504,1505,1507],{},"Some proposals need something only you can supply. Check these with ",[513,1506,646],{},":",[582,1509,1510,1520,1527],{},[585,1511,1512,1513,1516,1517,543],{},"An Android build needs the SDK. Pass ",[513,1514,1515],{},"ANDROID_HOME"," through with the repo's ",[513,1518,1519],{},"env_passthrough",[585,1521,1522,1523,1526],{},"A Rails app's ",[513,1524,1525],{},"bin\u002Fsetup --skip-server"," prepares the database, so the database must be running.",[585,1528,1529],{},"A test target that starts docker needs docker where the work item runs.",[558,1531,1533],{"id":1532},"directories-and-scopes","Directories and scopes",[510,1535,1536,1537,1107,1541,1543],{},"Each directory up to two levels below the root that has its own tests becomes a test scope of its own. Two levels is the default: ",[533,1538,1539],{"href":1103},[513,1540,1106],{},[513,1542,302],{}," changes it. Some directories are skipped:",[582,1545,1546,1549,1584],{},[585,1547,1548],{},"hidden directories",[585,1550,1551,1552,638,1555,638,1558,638,1561,638,1564,638,1567,638,1570,638,1572,638,1574,1577,1578,1107,1581,1583],{},"the usual non-project names, in any case: ",[513,1553,1554],{},"examples",[513,1556,1557],{},"benchmarks",[513,1559,1560],{},"support",[513,1562,1563],{},"docs",[513,1565,1566],{},"fixtures",[513,1568,1569],{},"vendor",[513,1571,883],{},[513,1573,870],{},[513,1575,1576],{},"build"," and the like (",[513,1579,1580],{},"ignore_dirs",[513,1582,302],{}," adds names)",[585,1585,1586],{},"a submodule's contents, because a submodule is a repo of its own",[510,1588,1589,1590,1593,1594,1596,1597,543],{},"A scope's command runs from the worktree root without a shell, so a nested scope's command is written ",[513,1591,1592],{},"sh -c 'cd web && npm test'",". Its setup joins the repo's ",[513,1595,519],{}," in a subshell, for example ",[513,1598,1599],{},"uv sync && (cd web && npm ci)",[510,1601,1602],{},"Two things prepare a nested project from above:",[582,1604,1605,1615],{},[585,1606,1607,1610,1611,1614],{},[596,1608,1609],{},"A workspace root."," A pnpm or npm workspace, a Cargo ",[513,1612,1613],{},"[workspace]",", a uv workspace, a multi-module Maven or Gradle build, a .NET solution, or an Elixir umbrella installs its members. When the root has a test command, its members are not scopes of their own. A member with a lockfile of its own installs on its own.",[585,1616,1617,634,1620,638,1623,1626,1627,638,1630,638,1633,1636],{},[596,1618,1619],{},"The root's own setup task",[513,1621,1622],{},"just setup",[513,1624,1625],{},"make setup","), for each directory that task, or a task it depends on, works in: ",[513,1628,1629],{},"cd web",[513,1631,1632],{},"--prefix web",[513,1634,1635],{},"web\u002F...",". Comments and other recipes do not count.",[510,1638,1639,1640,1279,1643,1279,1645,1647],{},"A root that is a project itself (a ",[513,1641,1642],{},"Gemfile",[513,1644,1264],{},[513,1646,893],{},") with no test command found, while directories below it have theirs, gets no proposal at all. A change to the root's own code would select only the nested scopes, and pass on them. Connect says which file made the root a project.",[510,1649,1650,1651,1653,1654,1656],{},"Pass ",[513,1652,637],{}," for the root, or ",[513,1655,617],{}," if the root really has none; the nested scopes are then proposed.",[510,1658,1659,1660,1662,1663,1665,1666,551,1668,1670],{},"A proposed command whose program this machine's ",[513,1661,1005],{}," does not have (a ",[513,1664,1037],{}," scope on a machine with no deno) is named at connect, with its directory: a work item would fail on it until it is installed. The scope stays, since its tests are real; connect with your own ",[513,1667,637],{},[513,1669,641],{}," to leave it out.",[510,1672,1673,1674,1676,1677,1679,1680,1682],{},"If a directory has a test command and nothing prepares it, ",[513,1675,519],{}," is left undeclared. ",[513,1678,515],{}," names the directory. The repo's first work item then stops until you declare a setup command, which can be ",[513,1681,593],{}," for none.",[558,1684,1686],{"id":1685},"limits-on-what-the-probe-reads","Limits on what the probe reads",[510,1688,1689],{},"A repository's files are whatever someone committed, so the probe treats them as hostile. These limits keep a file from stalling the Kraft server or leaking its secrets:",[831,1691,1692,1702],{},[834,1693,1694],{},[837,1695,1696,1699],{},[840,1697,1698],{},"Limit",[840,1700,1701],{},"Value",[850,1703,1704,1712,1726,1734,1742,1750,1758,1766],{},[837,1705,1706,1709],{},[855,1707,1708],{},"Time",[855,1710,1711],{},"The probe runs in a process of its own, killed after two minutes.",[837,1713,1714,1717],{},[855,1715,1716],{},"Environment",[855,1718,1719,1720,638,1722,1725],{},"That process gets none of the server's environment beyond ",[513,1721,1005],{},[513,1723,1724],{},"HOME"," and the locale, so none of its API keys or tokens. It never imports from the directory the server was started in.",[837,1727,1728,1731],{},[855,1729,1730],{},"One CI file or Taskfile",[855,1732,1733],{},"Up to 50,000 YAML nodes and script lines, counted before the YAML is built, with every use of an alias counting again. One past the limit is skipped.",[837,1735,1736,1739],{},[855,1737,1738],{},"All CI files and Taskfiles together",[855,1740,1741],{},"Up to 200,000 nodes and script lines. One past the limit is skipped.",[837,1743,1744,1747],{},[855,1745,1746],{},"All files in one probe",[855,1748,1749],{},"64 MB.",[837,1751,1752,1755],{},[855,1753,1754],{},"A file that cannot be parsed, or is nested deeper than the parser goes",[855,1756,1757],{},"Not evidence. The rest of the repo still is.",[837,1759,1760,1763],{},[855,1761,1762],{},"A CI or dev container command with a control character in it (an ANSI escape, a bidi override)",[855,1764,1765],{},"Not a candidate: it could show you one command while another runs.",[837,1767,1768,1771],{},[855,1769,1770],{},"The repo's own git settings",[855,1772,1773,1774,1777],{},"They never run a program: ",[513,1775,1776],{},"core.fsmonitor"," is turned off for the probe's git calls.",[558,1779,1781],{"id":1780},"related","Related",[582,1783,1784,1792,1803],{},[585,1785,1786,1788,1789,1791],{},[533,1787,302],{"href":303},": the ",[513,1790,302],{}," keys that teach connect your own conventions, and the toolchains Kraft ships.",[585,1793,1794,1788,1796,638,1798,551,1800,1802],{},[533,1795,292],{"href":293},[513,1797,519],{},[513,1799,523],{},[513,1801,527],{}," fields a proposal fills in.",[585,1804,1805,1788,1807,1809],{},[533,1806,274],{"href":275},[513,1808,515],{}," flags.",{"title":1811,"searchDepth":1812,"depth":1812,"links":1813},"",2,[1814,1815,1819,1820,1828,1829,1830,1831],{"id":560,"depth":1812,"text":550},{"id":624,"depth":1812,"text":555,"children":1816},[1817],{"id":681,"depth":1818,"text":682},3,{"id":776,"depth":1812,"text":777},{"id":825,"depth":1812,"text":826,"children":1821},[1822,1823,1824,1825,1826,1827],{"id":983,"depth":1818,"text":984},{"id":1115,"depth":1818,"text":1116},{"id":1217,"depth":1818,"text":1218},{"id":1248,"depth":1818,"text":1249},{"id":1309,"depth":1818,"text":1310},{"id":1382,"depth":1818,"text":1383},{"id":1500,"depth":1812,"text":1501},{"id":1532,"depth":1812,"text":1533},{"id":1685,"depth":1812,"text":1686},{"id":1780,"depth":1812,"text":1781},"What kraft repo connect reads in a repo, where each proposed setup and test command comes from, and what it does when it finds none.","md",null,{},true,{"title":298,"description":1832},"iOSzcqdz12siwBusNpRwI76mF7lGsFovmErTSLEbG_Q",[1840,1842],{"title":10,"path":293,"stem":294,"description":1841,"children":-1},"Every field in repos.yaml, where a repo's value comes from, and the pages for how connect proposes commands, detectors, workspaces and sandboxes.",{"title":302,"path":303,"stem":304,"description":1843,"children":-1},"The keys of detectors.yaml, the file that teaches kraft repo connect your own setup and test conventions, and the toolchains Kraft ships.",1791801261550]