How Coding Harnesses Are Used: An Introspection
Tamarillo analyzed ~400K public GitHub repositories containing configuration files for AI coding assistants (harnesses) like Cursor, Copilot, and Claude. The study covers market share, adoption dynamics, configuration surface anatomy, multi-harness co-occurrence, and repo demographics by stars, language, and owner type. It reflects configuration intentions and is a lower bound on actual usage.
Article intelligence
Key points
- Approximately 400K public GitHub repos with AI coding harness configs were analyzed.
- Covers market share, adoption trends, configuration patterns, and multi-harness usage.
- Data is limited to public repos and reflects configuration setup, not daily usage.
Why it matters
This matters because approximately 400K public GitHub repos with AI coding harness configs were analyzed.
Technical impact
May affect model selection, inference cost, product capability, and evaluation benchmarks.
notebook.py
Tamarillo — AI Coding Harness Adoption
%23%20%2F%2F%2F%20script%0A%23%20requires-python%20%3D%20%22%3E%3D3.12%22%0A%23%20dependencies%20%3D%20%5B%22marimo%22%2C%20%22pandas%22%2C%20%22numpy%22%2C%20%22matplotlib%22%2C%20%22pyarrow%22%5D%0A%23%0A%23%20%5Btool.marimo.display%5D%0A%23%20theme%20%3D%20%22dark%22%0A%23%20%2F%2F%2F%0A%0Aimport%20marimo%0A%0A__generated_with%20%3D%20%220.23.6%22%0Aapp%20%3D%20marimo.App(%0A%20%20%20%20width%3D%22medium%22%2C%0A%20%20%20%20app_title%3D%22Tamarillo%20%E2%80%94%20AI%20Coding%20Harness%20Adoption%22%2C%0A%20%20%20%20css_file%3D%22tamarillo.css%22%2C%0A)%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%22%22%22%0A%20%20%20%20%23%20%60tamarillo%60%20%E2%80%94%20coding%20harness%20inspection%0A%0A%20%20%20%20In%20the%20past%202%20years%20coding%20harnesses%20(and%20even%20the%20term%20itself)%20became%20ubiquitous.%0A%20%20%20%20At%20Tamarillo%20one%20goal%20is%20to%20systematize%20the%20utilization%20of%20coding%20harnesses%20(that%20is%20why%20the%20%60theta-spec%60%0A%20%20%20%20and%20%60theta%60%20were%20created).%0A%0A%20%20%20%20~400K%20public%20GitHub%20repositories%20containing%20configuration%20files%20for%20AI%20coding%0A%20%20%20%20assistants%20(harnesses)%20were%20fetched.%20~400K%20was%20the%20count%20at%20time%20of%20collection%0A%20%20%20%20after%20exhaustively%20searching%20GitHub%20public%20repos%3Csup%20style%3D%22font-size%3A0.7em%22%3E%3Ca%20href%3D%22%23fn-forks%22%3E%5B%E2%80%A0%5D%3C%2Fa%3E%3C%2Fsup%3E.%0A%20%20%20%20The%20process%20to%20get%20the%20data%20is%20pretty%20straightforward%0A%20%20%20%20-%20%60filter%20criteria%60%3A%20%60PATTERNS%60%20per%20harness%20were%20defined%20(explained%20in%20detail%20in%20%5Bappendix%20A%5D(%23appendix-a-search-patterns-per-harness))%0A%20%20%20%20-%20%60repo%20search%60%3A%20Code%20searches%20on%20GitHub's%20REST%20API%20filtered%20against%20harness%20configuration%20files%0A%20%20%20%20-%20%60enriching%20stage%60%3A%20GitHub's%20GraphQL%20API%20was%20used%20to%20enrich%20files%20with%20commit%20count%2C%20file%20bytes%2C%20creation%20date%2C%20etc.%0A%0A%20%20%20%20This%20document%20covers%20a%20couple%20of%20things%2C%20market%20share%20and%20adoption%20dynamics%2C%20configuration%20surface%0A%20%20%20%20anatomy%20(what%20files%20exist%2C%20how%20big%2C%20how%20often%20touched)%2C%20multi-harness%20co-occurrence%2C%0A%20%20%20%20repo%20demographics%20by%20stars%2Flanguage%2Fowner%20type%2C%20and%20other%20yerbas.%20It%20was%20created%20with%20the%20intent%20of%0A%20%20%20%20being%20a%20DIY-thermometer%20for%20a%20**slice**%20of%20a%20domain.%20Although%20some%20suspicions%20were%20confirmed%20(maybe%20some%20obvious%20ones%20it%20MAY%20be%20argued)%2C%0A%20%20%20%20it%20is%20strongly%20suggested%20to%20the%20reader%20to%20read%20the%20%5Blimitations%20and%20methodology%5D(%23methodology--limitations)%20section%20in%20this%20document.%0A%0A%20%20%20%20Only%20public%20repositories%20were%20fetched.%20The%20dataset%20reflects%20configuration%20intentions%0A%20%20%20%20(i.e.%20a%20repo%20that%20has%20a%20%60.cursorrules%60%20file%20signals%20that%20someone%20set%20it%20up%2C%20not%20necessarily%20that%20Cursor%20is%0A%20%20%20%20daily%20used).%20This%20is%20a%20lower%20bound%20on%20harness%20adoption.%0A%0A%20%20%20%20%3Csmall%20id%3D%22fn-forks%22%20style%3D%22color%3A%239a92ad%22%3E%0A%20%20%20%20%5B%E2%80%A0%5D%20the%20number%20of%20repositories%20fetched%20does%20include%20a%20negligible%20amount%20of%20forks%20of%20already%20captured%20repos%20(%3C0.1%25).%20This%20were%20excluded%20for%20the%20analysis.%0A%20%20%20%20%3C%2Fsmall%3E%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%0A%20%20%20%20return%20(mo%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20hashlib%0A%20%20%20%20import%20importlib%0A%20%20%20%20import%20io%0A%20%20%20%20import%20json%0A%20%20%20%20import%20pathlib%0A%20%20%20%20import%20sys%0A%20%20%20%20import%20urllib.request%0A%0A%20%20%20%20import%20matplotlib.dates%20as%20mdates%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20import%20pandas%20as%20pd%0A%20%20%20%20from%20matplotlib.colors%20import%20LinearSegmentedColormap%0A%0A%20%20%20%20BG%20%3D%20%22%230f0d1a%22%0A%20%20%20%20BG_LIFT%20%3D%20%22%231a1729%22%0A%20%20%20%20BORDER%20%3D%20%22%232d2943%22%0A%20%20%20%20GRID%20%3D%20%22%232d2943%22%0A%0A%20%20%20%20TEXT%20%3D%20%22%23f5efe8%22%0A%20%20%20%20TEXT_DIM%20%3D%20%22%239a92ad%22%0A%0A%20%20%20%20TAMARILLO%20%3D%20%22%23ff764d%22%0A%20%20%20%20TAMARILLO_BRIGHT%20%3D%20%22%23ff9570%22%0A%20%20%20%20INDIGO%20%3D%20%22%237b7bd1%22%0A%20%20%20%20INDIGO_DEEP%20%3D%20%22%234b4baf%22%0A%0A%20%20%20%20HARNESS_COLORS%3A%20dict%5Bstr%2C%20str%5D%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22claude%22%3A%20%22%23ff764d%22%2C%0A%20%20%20%20%20%20%20%20%22copilot%22%3A%20%22%237b7bd1%22%2C%0A%20%20%20%20%20%20%20%20%22cursor%22%3A%20%22%23c9a7ff%22%2C%0A%20%20%20%20%20%20%20%20%22codex%22%3A%20%22%236fe3c2%22%2C%0A%20%20%20%20%20%20%20%20%22gemini%22%3A%20%22%237ec8f0%22%2C%0A%20%20%20%20%20%20%20%20%22windsurf%22%3A%20%22%23ff9ec7%22%2C%0A%20%20%20%20%20%20%20%20%22opencode%22%3A%20%22%23ffc266%22%2C%0A%20%20%20%20%20%20%20%20%22continue%22%3A%20%22%235fd9d9%22%2C%0A%20%20%20%20%20%20%20%20%22aider%22%3A%20%22%23ff8b8b%22%2C%0A%20%20%20%20%20%20%20%20%22cline%22%3A%20%22%23b389ff%22%2C%0A%20%20%20%20%20%20%20%20%22hermes%22%3A%20%22%238ad39c%22%2C%0A%20%20%20%20%20%20%20%20%22pi%22%3A%20%22%23ff9570%22%2C%0A%20%20%20%20%20%20%20%20%22trae%22%3A%20%22%235fd9b8%22%2C%0A%20%20%20%20%20%20%20%20%22zed%22%3A%20%22%23d4a3ff%22%2C%0A%20%20%20%20%20%20%20%20%22jetbrains%22%3A%20%22%23ffb38a%22%2C%0A%20%20%20%20%20%20%20%20%22goose%22%3A%20%22%23a8e0b8%22%2C%0A%20%20%20%20%20%20%20%20%22cody%22%3A%20%22%23e0d28a%22%2C%0A%20%20%20%20%20%20%20%20%22augment%22%3A%20%22%23a3d4ff%22%2C%0A%20%20%20%20%20%20%20%20%22amazonq%22%3A%20%22%23ffa3c7%22%2C%0A%20%20%20%20%20%20%20%20%22supermaven%22%3A%20%22%23c7a3ff%22%2C%0A%20%20%20%20%20%20%20%20%22tabnine%22%3A%20%22%23a3ffd4%22%2C%0A%20%20%20%20%20%20%20%20%22openclaw%22%3A%20%22%23ffc7a3%22%2C%0A%20%20%20%20%20%20%20%20%22void%22%3A%20%22%23a3c7ff%22%2C%0A%20%20%20%20%20%20%20%20%22theta%22%3A%20%22%23f5efe8%22%2C%0A%20%20%20%20%20%20%20%20%22mcp%22%3A%20%22%238a8299%22%2C%0A%20%20%20%20%20%20%20%20%22shared%22%3A%20%22%236b6380%22%2C%0A%20%20%20%20%7D%0A%0A%20%20%20%20FALLBACK_HARNESS_COLORS%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%22%23d4a3ff%22%2C%0A%20%20%20%20%20%20%20%20%22%23ffb38a%22%2C%0A%20%20%20%20%20%20%20%20%22%23a8e0b8%22%2C%0A%20%20%20%20%20%20%20%20%22%23e0d28a%22%2C%0A%20%20%20%20%20%20%20%20%22%23a3d4ff%22%2C%0A%20%20%20%20%20%20%20%20%22%23ffa3c7%22%2C%0A%20%20%20%20%20%20%20%20%22%23c7a3ff%22%2C%0A%20%20%20%20%20%20%20%20%22%23a3ffd4%22%2C%0A%20%20%20%20%20%20%20%20%22%23ffc7a3%22%2C%0A%20%20%20%20%20%20%20%20%22%23a3c7ff%22%2C%0A%20%20%20%20%5D%0A%0A%20%20%20%20def%20color_for(harness%3A%20str)%20-%3E%20str%3A%0A%20%20%20%20%20%20%20%20%22%22%22Return%20a%20stable%20color%20for%20a%20harness.%22%22%22%0A%20%20%20%20%20%20%20%20if%20harness%20in%20HARNESS_COLORS%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20HARNESS_COLORS%5Bharness%5D%0A%20%20%20%20%20%20%20%20digest%20%3D%20hashlib.sha1(harness.encode(%22utf-8%22)).digest()%0A%20%20%20%20%20%20%20%20return%20FALLBACK_HARNESS_COLORS%5Bdigest%5B0%5D%20%25%20len(FALLBACK_HARNESS_COLORS)%5D%0A%0A%20%20%20%20SURFACE_COLORS%3A%20dict%5Bstr%2C%20str%5D%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22system_prompt%22%3A%20%22%23ff764d%22%2C%0A%20%20%20%20%20%20%20%20%22rule%22%3A%20%22%237b7bd1%22%2C%0A%20%20%20%20%20%20%20%20%22agent%22%3A%20%22%23c9a7ff%22%2C%0A%20%20%20%20%20%20%20%20%22skill%22%3A%20%22%23ffc266%22%2C%0A%20%20%20%20%20%20%20%20%22command%22%3A%20%22%23ff9ec7%22%2C%0A%20%20%20%20%20%20%20%20%22prompt%22%3A%20%22%23ff9570%22%2C%0A%20%20%20%20%20%20%20%20%22tool_mcp%22%3A%20%22%235fd9d9%22%2C%0A%20%20%20%20%20%20%20%20%22hook%22%3A%20%22%238ad39c%22%2C%0A%20%20%20%20%20%20%20%20%22ignore%22%3A%20%22%236b6380%22%2C%0A%20%20%20%20%20%20%20%20%22settings%22%3A%20%22%23a5a5e0%22%2C%0A%20%20%20%20%20%20%20%20%22other%22%3A%20%22%233a3545%22%2C%0A%20%20%20%20%7D%0A%0A%20%20%20%20TAMARILLO_HEAT%20%3D%20LinearSegmentedColormap.from_list(%0A%20%20%20%20%20%20%20%20%22tamarillo_heat%22%2C%0A%20%20%20%20%20%20%20%20%5BBG%2C%20INDIGO_DEEP%2C%20%22%238a4bbf%22%2C%20TAMARILLO%2C%20TAMARILLO_BRIGHT%2C%20%22%23ffe0c2%22%5D%2C%0A%20%20%20%20%20%20%20%20N%3D256%2C%0A%20%20%20%20)%0A%0A%20%20%20%20def%20apply_matplotlib_theme()%20-%3E%20None%3A%0A%20%20%20%20%20%20%20%20%22%22%22Apply%20the%20Tamarillo%20dark%20style%20to%20matplotlib.%22%22%22%0A%20%20%20%20%20%20%20%20plt.style.use(%22dark_background%22)%0A%20%20%20%20%20%20%20%20plt.rcParams.update(%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22figure.facecolor%22%3A%20BG%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22axes.facecolor%22%3A%20BG%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22savefig.facecolor%22%3A%20BG%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22text.color%22%3A%20TEXT%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22axes.labelcolor%22%3A%20TEXT%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22xtick.color%22%3A%20TEXT_DIM%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22ytick.color%22%3A%20TEXT_DIM%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22axes.edgecolor%22%3A%20BORDER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22axes.linewidth%22%3A%200.6%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22axes.spines.top%22%3A%20False%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22axes.spines.right%22%3A%20False%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22axes.grid%22%3A%20True%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22axes.grid.axis%22%3A%20%22y%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22grid.color%22%3A%20GRID%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22grid.alpha%22%3A%200.25%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22grid.linewidth%22%3A%200.4%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22grid.linestyle%22%3A%20%22--%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22font.family%22%3A%20%22sans-serif%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22font.size%22%3A%2010%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22axes.titlesize%22%3A%2013%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22axes.titleweight%22%3A%20%22bold%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22axes.labelsize%22%3A%2011%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22legend.fontsize%22%3A%209%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22xtick.labelsize%22%3A%209%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22ytick.labelsize%22%3A%209%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22axes.titlepad%22%3A%2014%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22axes.labelpad%22%3A%208%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22xtick.major.size%22%3A%200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22ytick.major.size%22%3A%200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22xtick.major.pad%22%3A%206%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22ytick.major.pad%22%3A%206%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22legend.facecolor%22%3A%20BG_LIFT%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22legend.edgecolor%22%3A%20BORDER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22legend.framealpha%22%3A%200.92%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22legend.borderpad%22%3A%200.6%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22legend.labelspacing%22%3A%200.4%2C%0A%20%
[truncated for AI cost control]