<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Yoshihisa Kaino</title>
    <description>The latest articles on DEV Community by Yoshihisa Kaino (@yosh1).</description>
    <link>https://dev.to/yosh1</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4134422%2F6420e000-9db9-4019-9876-d2d76e333ad0.png</url>
      <title>DEV Community: Yoshihisa Kaino</title>
      <link>https://dev.to/yosh1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yosh1"/>
    <language>en</language>
    <item>
      <title>What I learned counting AI co-authored commits across 26,000 of my own</title>
      <dc:creator>Yoshihisa Kaino</dc:creator>
      <pubDate>Sun, 20 Sep 2026 17:40:26 +0000</pubDate>
      <link>https://dev.to/yosh1/what-i-learned-counting-ai-co-authored-commits-across-26000-of-my-own-1h9m</link>
      <guid>https://dev.to/yosh1/what-i-learned-counting-ai-co-authored-commits-across-26000-of-my-own-1h9m</guid>
      <description>&lt;p&gt;I use Claude Code every day, but if you asked me how much of my code I actually&lt;br&gt;
write with it, all I had was a feeling. The data was sitting right there in git&lt;br&gt;
the whole time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git log &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'%b'&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'Co-Authored-By: Claude'&lt;/span&gt;
&lt;span class="go"&gt;960
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;960 out of 1,107 commits in that repo. Across everything I've touched:&lt;br&gt;
&lt;strong&gt;10,261 of 26,251 commits — 39%.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://github.com/yosh1/cocommit" rel="noopener noreferrer"&gt;a small tool&lt;/a&gt; to render that as an&lt;br&gt;
SVG card for a GitHub profile. The tool is the boring part. What I found while&lt;br&gt;
building it is what I actually want to write about.&lt;/p&gt;


&lt;h2&gt;
  
  
  1. GitHub has an undocumented &lt;code&gt;co-authored-by:&lt;/code&gt; search qualifier
&lt;/h2&gt;

&lt;p&gt;The commit search API accepts this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;gh api &lt;span class="s1"&gt;'/search/commits?q=author:USER+co-authored-by:noreply@anthropic.com&amp;amp;per_page=1'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="go"&gt;    --jq '.total_count'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It works. It is also documented nowhere — it does not appear in &lt;a href="https://docs.github.com/en/search-github/searching-commits" rel="noopener noreferrer"&gt;GitHub's&lt;br&gt;
commit search docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Since "it seems to work" is not evidence, I ran a control (counts move as I&lt;br&gt;
commit, so these are one snapshot rather than fixed values):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Query (all with &lt;code&gt;author:USER&lt;/code&gt;)&lt;/th&gt;
&lt;th&gt;&lt;code&gt;total_count&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;co-authored-by:noreply@anthropic.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;10,261&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;co-authored-by:copilot@github.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zzznotaqualifier:noreply@anthropic.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;no qualifier&lt;/td&gt;
&lt;td&gt;26,251&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;An invented qualifier returns zero. Change the value and the count changes.&lt;br&gt;
The parser recognizes it.&lt;/p&gt;

&lt;p&gt;But undocumented means it can vanish without notice, and &lt;strong&gt;the dangerous&lt;br&gt;
failure mode isn't returning zero.&lt;/strong&gt; If GitHub stops parsing the qualifier, it&lt;br&gt;
falls back to treating the whole thing as free text, which matches &lt;em&gt;everything&lt;/em&gt;&lt;br&gt;
— and you'd proudly render "100% AI co-authored."&lt;/p&gt;

&lt;p&gt;So the check is on both sides:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Co-authored commits are a strict subset of all commits. A count equal to&lt;/span&gt;
&lt;span class="c1"&gt;// the total means the qualifier didn't filter at all.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;unusable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Searching by display name silently counts the wrong people
&lt;/h2&gt;

&lt;p&gt;This is the one that surprised me, and it's the bug I shipped first.&lt;/p&gt;

&lt;p&gt;My initial implementation searched &lt;code&gt;co-authored-by:claude&lt;/code&gt; — the agent's name.&lt;br&gt;
Reasonable-looking, and it returns a plausible number. Then I added Cursor and&lt;br&gt;
got this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;gh api &lt;span class="s1"&gt;'/search/commits?q=co-authored-by:cursor+is:public'&lt;/span&gt; &lt;span class="nt"&gt;--jq&lt;/span&gt; &lt;span class="s1"&gt;'.total_count'&lt;/span&gt;
&lt;span class="go"&gt;10033042
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ten million felt too round. I looked at what was actually matching:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;gh api &lt;span class="s1"&gt;'/search/commits?q=co-authored-by:cursor+is:public&amp;amp;per_page=5'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="go"&gt;    --jq '.items[].commit.message' | grep -i co-authored
&lt;/span&gt;&lt;span class="gp"&gt;Co-authored-by: Cursor &amp;lt;cursoragent@cursor.com&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The real trailer uses an address. Searching the &lt;em&gt;name&lt;/em&gt; matches any co-author&lt;br&gt;
who happens to share it. And when I checked my own supposedly-correct Claude&lt;br&gt;
numbers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name form : 10,262
email form: 10,255
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Seven commits of drift. Looking at what those matched, they carried a second&lt;br&gt;
trailer naming a human collaborator — a teammate, counted as an AI, because a&lt;br&gt;
name is not an identity. Every agent is now keyed on the address in its&lt;br&gt;
trailer.&lt;/p&gt;

&lt;p&gt;This matters more than it sounds, because some tools put &lt;em&gt;variable&lt;/em&gt; text in the&lt;br&gt;
display name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Co-authored-by: aider (anthropic/claude-sonnet-5) &amp;lt;aider@aider.chat&amp;gt;
Co-authored-by: aider (ollama/gemma4:e4b-mlx)    &amp;lt;aider@aider.chat&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aider appends whichever model it used. The name is unstable; the address isn't.&lt;/p&gt;

&lt;p&gt;I read the trailers off real public commits rather than trusting vendor docs.&lt;br&gt;
Here's what nine agents actually write, with the public commit count each one&lt;br&gt;
has as of today:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;Trailer address&lt;/th&gt;
&lt;th&gt;Public commits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude&lt;/td&gt;
&lt;td&gt;&lt;code&gt;noreply@anthropic.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;89,025,757&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cursor&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cursoragent@cursor.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;8,374,584&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Copilot&lt;/td&gt;
&lt;td&gt;&lt;code&gt;copilot@github.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;4,046,637&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Codex&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;codex@openai.com&lt;/code&gt;, &lt;code&gt;noreply@openai.com&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;1,812,065&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Devin&lt;/td&gt;
&lt;td&gt;&lt;code&gt;devin-ai-integration[bot]@users.noreply.github.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;588,010&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;gemini-code-assist@google.com&lt;/code&gt; + bot address&lt;/td&gt;
&lt;td&gt;290,638&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jules&lt;/td&gt;
&lt;td&gt;&lt;code&gt;google-labs-jules[bot]@users.noreply.github.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;233,948&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aider&lt;/td&gt;
&lt;td&gt;&lt;code&gt;aider@aider.chat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;133,041&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amp&lt;/td&gt;
&lt;td&gt;&lt;code&gt;amp@ampcode.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;104,075&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One tool I expected to find had no dedicated trailer at all — searching for it&lt;br&gt;
returned only human contributors. Worth checking before you assume.&lt;/p&gt;
&lt;h2&gt;
  
  
  3. What GitHub's image proxy (camo) actually allows
&lt;/h2&gt;

&lt;p&gt;Every image in a README is rewritten through &lt;code&gt;camo.githubusercontent.com&lt;/code&gt;.&lt;br&gt;
People repeat a lot of folklore about what survives that trip, so I read the&lt;br&gt;
response headers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;content-security-policy: default-src 'none'; img-src data:; style-src 'unsafe-inline'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That single line settles it:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;blocked&lt;/strong&gt; (&lt;code&gt;default-src 'none'&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web fonts&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;blocked&lt;/strong&gt; — system font stacks or nothing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;External images&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;blocked&lt;/strong&gt; (&lt;code&gt;img-src data:&lt;/code&gt; only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CSS animation&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;allowed&lt;/strong&gt; (&lt;code&gt;style-src 'unsafe-inline'&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Animation works, which is fun — until it doesn't. My first version grew the&lt;br&gt;
bars from zero:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;rect&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;animate&lt;/span&gt; &lt;span class="na"&gt;attributeName=&lt;/span&gt;&lt;span class="s"&gt;"height"&lt;/span&gt; &lt;span class="na"&gt;to=&lt;/span&gt;&lt;span class="s"&gt;"28"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&amp;lt;/rect&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rasterize that locally and &lt;strong&gt;the bars disappear.&lt;/strong&gt; Anything that ignores SMIL&lt;br&gt;
sees &lt;code&gt;height="0"&lt;/code&gt;. Static renderers, social preview generators, and thumbnail&lt;br&gt;
pipelines all land there.&lt;/p&gt;

&lt;p&gt;The fix is to make the resting state the truth and let animation only supply a&lt;br&gt;
starting point:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;rect&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"28"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;animate&lt;/span&gt; &lt;span class="na"&gt;attributeName=&lt;/span&gt;&lt;span class="s"&gt;"height"&lt;/span&gt; &lt;span class="na"&gt;from=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;to=&lt;/span&gt;&lt;span class="s"&gt;"28"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&amp;lt;/rect&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now it animates where animation runs and looks finished everywhere else. There&lt;br&gt;
is a test for it, because I will absolutely make this mistake again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;animated rendering still declares the finished geometry&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;svg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;renderCard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sample&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;animate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;doesNotMatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;svg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sr"&gt;/height="0"/&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Why this can't be a hosted service
&lt;/h2&gt;

&lt;p&gt;I started out planning a github-readme-stats-style URL that returns an SVG.&lt;br&gt;
Then I compared the two numbers I could offer:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;AI-written&lt;/th&gt;
&lt;th&gt;Total&lt;/th&gt;
&lt;th&gt;Share&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;including private&lt;/td&gt;
&lt;td&gt;10,261&lt;/td&gt;
&lt;td&gt;26,251&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;39%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;public only&lt;/td&gt;
&lt;td&gt;126&lt;/td&gt;
&lt;td&gt;5,688&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Work code lives in private repos. A public-only number isn't a smaller version&lt;br&gt;
of the truth, it's a different number — 2% instead of 39%.&lt;/p&gt;

&lt;p&gt;And commit search only sees repositories the token owner can reach. Other&lt;br&gt;
people's &lt;em&gt;public&lt;/em&gt; commits are searchable, but their private ones never are. So&lt;br&gt;
a hosted service can only ever offer the 2% number, no matter how many tokens&lt;br&gt;
it pools.&lt;/p&gt;

&lt;p&gt;Running in the user's own CI solves it completely: their token, their private&lt;br&gt;
repos, their number. No server, no one else's PAT to hold.&lt;/p&gt;

&lt;p&gt;The API shape helps too — I only ever read &lt;code&gt;total_count&lt;/code&gt;, never enumerate&lt;br&gt;
commits. (Which is lucky, since search caps enumeration at 1,000 results while&lt;br&gt;
&lt;code&gt;total_count&lt;/code&gt; stays accurate well past it.) Repository names, commit messages&lt;br&gt;
and diffs are never read.&lt;/p&gt;


&lt;h2&gt;
  
  
  The part that stuck with me
&lt;/h2&gt;

&lt;p&gt;Twelve months of history, charted:&lt;/p&gt;

&lt;p&gt;October 2025: 42 commits. September 2026: 2,067. &lt;strong&gt;A 49x increase&lt;/strong&gt;, with the&lt;br&gt;
most recent months running above 80%.&lt;/p&gt;

&lt;p&gt;I knew my workflow had changed. I didn't know it had changed &lt;em&gt;that&lt;/em&gt; much, and I&lt;br&gt;
couldn't have told you so with a number before this. That turned out to be&lt;br&gt;
worth more than the card itself.&lt;/p&gt;

&lt;p&gt;The tool is MIT licensed and has zero dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ghp_... npx github:yosh1/cocommit &lt;span class="nt"&gt;--user&lt;/span&gt; your-login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/yosh1/cocommit" rel="noopener noreferrer"&gt;https://github.com/yosh1/cocommit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If your agent isn't in the table, &lt;code&gt;git log --format='%b' | grep -i co-authored&lt;/code&gt;&lt;br&gt;
will show you what it writes — send me the trailer and I'll add it.&lt;/p&gt;

</description>
      <category>github</category>
      <category>ai</category>
      <category>opensource</category>
      <category>git</category>
    </item>
  </channel>
</rss>
